C字符串字面值“太大,无法转换为字符”。

12

我尝试使用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的值会被视为“太大”。 - twalberg
谢谢,但不行。我也尝试使用无符号字符了,但是出现了相同的错误信息。 - Lothar
@Lothar:我不是要当纳粹分子,但你是指 ANSI C 而不是 ASCII C,对吧? ;) 此外,你说得对,没有真正可移植的方法来处理 Unicode。如果你使用的字符集> 8位,则需要自己指定编码。请查看此帖子:https://dev59.com/iknSa4cB1Zd3GeqPNFhf - Morten Jensen
1个回答

16

不幸的是,你发现了\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的微软C++编译器上进行了测试。
  2. gcc 4.3.4上进行了测试。

1
我的 Vim 语法高亮似乎符合这个规则。无论如何,x 应该是一个 char const* - bitmask
1
另一个选项是切换到八进制:"\274d" 被解释为两个字符的字符串,"\2740" 也是如此。 - user4815162342
@bitmask:我相信你的意思是 const char*char *const 会声明一个常量指针,但这里不需要指针是常量。 - Ed S.
1
@bitmask:好的,我看错了。不过这种写法很奇怪,虽然实现的功能是一样的,但不太符合惯用方式。 - Ed S.
1
@bitmask:我明白从右到左阅读声明是惯用的方式,也明白在类型前面放置它是一种特殊情况,但我认为你很难争辩将const限定符放在类型后面比相反方式更常见。当然,这是一个风格问题,所以无所谓,公平对待。 - Ed S.
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接