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
4

1 回答 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 随附的 Microsoft C++ 编译器上测试
  2. gcc 4.3.4上测试。
于 2012-12-03T21:47:48.317 回答