【问题标题】:C String Literal "too big for character"C 字符串文字“对于字符来说太大”
【发布时间】:2012-12-03 21:39:17
【问题描述】:

使用 MSVC 2010 我尝试在 C 或 C++ 模式下编译它(需要在这两种模式下都可以编译)和 这没用。为什么?我认为并在文档中发现 '\x' 将接下来的两个字符作为十六进制字符,而不是更多(使用 \X 时为 4 个字符)。

我还了解到,无论如何,在 C 源代码中没有可移植的方式来使用 ASCII 以外的字符代码,那么我该如何指定一些德语 ISO-8859-1 字符?

int main() {
     char* x = "\xBCd";  // Why is this not char(188) + 'd'
}

// returns  test.c(2) : error C2022: '3021' : too big for character
// and a warning with GCC

【问题讨论】:

  • unsigned charchar? char 很可能已签名,在这种情况下,大于 127 的值“太大”。
  • 谢谢,但没有。我也用 unsigned char 试过了。同样的错误信息。
  • @Lothar:我的意思不是纳粹,但你的意思是 ANSI C 而不是 ASCII C 对吧? ;) 另外,你是对的,没有真正的可移植方式来做 unicode。如果您使用的是大于 8 位的字符集,则需要自己指定编码。查看此帖子:stackoverflow.com/questions/1421811/…

标签: c string literals


【解决方案1】:

不幸的是,您偶然发现\x 会读取每一个看起来是十六进制1,2 的最后一个字符,而您需要将其分解:

const char *x = "\xBC" "d"; /* const added to satisfy literal assignment probs */

考虑这个程序的输出:

/* wide.c */
#include <stdio.h>
int main(int argc, char **argv) 
{
    const char *x = "\x000000000000021";
    return printf("%s\n", x);
}

编译并执行:

C:\temp>cl /nologo wide.c
wide.c

C:\temp>wide
!
  1. 在随 VS 2k12、2k10、2k8 和 2k5 提供的 Microsoft C++ 编译器上测试
  2. gcc 4.3.4 上测试。

【讨论】:

  • 我的 Vim 语法高亮似乎同意这条规则。总之,x 应该是char const*
  • 另一种选择是切换到八进制:"\274d" 被解释为两个字符的字符串,"\2740" 也是如此。
  • @bitmask:我相信你的意思是const char*char *const 会声明一个 const 指针,但这不是这里需要的 const
  • @bitmask:好的,我看错了。这是写cont char* 的一种非常奇怪的方式,尽管它完成了完全相同的事情,只是以一种不那么惯用的方式。
  • @bitmask:嗯,我意识到从右到左阅读声明是阅读它们的预期方式,我也意识到把它放在开头是一种特殊情况,但我认为你将很难争辩将 const 限定符放在类型之后比相反更常见。这当然是风格问题,所以嗯,很公平。
猜你喜欢
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多