Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ LLVM下的非ASCII wchar\t文本_C++_Ios_Xcode4_Llvm_Wchar T - Fatal编程技术网

C++ LLVM下的非ASCII wchar\t文本

C++ LLVM下的非ASCII wchar\t文本,c++,ios,xcode4,llvm,wchar-t,C++,Ios,Xcode4,Llvm,Wchar T,我已经将一个Xcode iOS项目从Xcode 3.2.6迁移到了4.2。现在,当我尝试使用带有非ASCII字符的文本初始化wchar\u t时,会收到警告: wchar_t c1; if(c1 <= L'я') //That's Cyrillic "ya" wchar\u t c1; 如果(C1<P>我没有回答你的具体问题,但想指出LLVM GCC已经永久停止。在我处理Clang和LLVM GCC和GCC之间的Delta的经验中,Clang经常对C++规范是正确的,即使这种行为令人惊讶

我已经将一个Xcode iOS项目从Xcode 3.2.6迁移到了4.2。现在,当我尝试使用带有非ASCII字符的文本初始化wchar\u t时,会收到警告:

wchar_t c1;
if(c1 <= L'я') //That's Cyrillic "ya"
wchar\u t c1;

如果(C1<P>我没有回答你的具体问题,但想指出LLVM GCC已经永久停止。在我处理Clang和LLVM GCC和GCC之间的Delta的经验中,Clang经常对C++规范是正确的,即使这种行为令人惊讶。

< P>我没有答案。问题,但要指出LLVM GCC已经永久停止。在我处理Clang和LLVM GCC和GCC之间的Delta的经验中,Clang对于C++规范通常是正确的,即使这种行为令人惊讶。

< P>不是答案,但希望有帮助的信息-我不能复制PROB。带有Clang4.0(代码4.5.1)的lem:

$uname-a
Darwin air 12.2.0 Darwin内核版本12.2.0:Sat Aug 25 00:48:52 PDT 2012;根目录:xnu-2050.18.24~1/RELEASE_X86_64 X86_64
$env| grep LANG
LANG=en_US.UTF-8
$clang-v
Apple clang版本4.0(tags/Apple/clang-421.0.60)(基于LLVM 3.1svn)
目标:x86_64-apple-darwin12.2.0
线程模型:posix
$cat test.c
#包括
#包括
内部主(空)
{
wchar_t c1=0;
printf(“sizeof(c1)=%lu\n”,sizeof(c1));
printf(“sizeof(L'Я')==%lu\n”,sizeof(L'Я');
if(c1

在clang++(其中,
wchar\u t
是内置类型)中也观察到了相同的行为。

不是答案,但希望是有用的信息-我无法重现clang 4.0(Xcode 4.5.1)的问题:

$uname-a
Darwin air 12.2.0 Darwin内核版本12.2.0:Sat Aug 25 00:48:52 PDT 2012;根目录:xnu-2050.18.24~1/RELEASE_X86_64 X86_64
$env| grep LANG
LANG=en_US.UTF-8
$clang-v
Apple clang版本4.0(tags/Apple/clang-421.0.60)(基于LLVM 3.1svn)
目标:x86_64-apple-darwin12.2.0
线程模型:posix
$cat test.c
#包括
#包括
内部主(空)
{
wchar_t c1=0;
printf(“sizeof(c1)=%lu\n”,sizeof(c1));
printf(“sizeof(L'Я')==%lu\n”,sizeof(L'Я');
if(c1

在clang++(其中,
wchar\u t
是内置类型)中也观察到了相同的行为。

如果事实上源代码是UTF-8,那么这是不正确的行为。但是我无法在最新版本的Xcode中重现这种行为

MyFile.cpp:148:28:警告:字符unicode转义序列对于其类型[2]太长

此错误应指向“通用字符名”(UCN),它看起来像“\U001012AB”或“\u0403”。它表示转义序列表示的值大于封闭文字类型能够容纳的值。例如,如果代码点值需要超过16位,则16位wchar\t将无法容纳该值

MyFile.cpp:148:28:警告:忽略宽字符常量中的无关字符[2]

这表明编译器认为在宽字符文本中有多个表示的代码点。例如,
L'ab'
。行为是实现定义的,clang和gcc都只使用最后一个代码点值

您显示的代码不应该触发这两种情况,至少在叮当声中是这样。第一个原因是这只适用于UCS,更不用说“呫”很容易适合单个16位wchar呫;第二个原因是源代码编码始终被视为UTF-8,并且它将“呫”的UTF-8多字节表示形式视为单个代码点。


您可以重新检查并确保源代码实际上是UTF-8。然后,您应该检查您使用的是最新版本的Xcode。您还可以尝试在“项目设置”>“为C/C++/Objective-C编译”中切换编译器。如果源代码实际上是UTF-8,则这是不正确的行为。但是,我无法在中重现该行为Xcode的最新版本

MyFile.cpp:148:28:警告:字符unicode转义序列对于其类型[2]太长

此错误应指向“通用字符名”(UCN),它看起来像“\U001012AB”或“\u0403”。它表示转义序列表示的值大于封闭文字类型能够容纳的值。例如,如果代码点值需要超过16位,则16位wchar\t将无法容纳该值

MyFile.cpp:148:28:警告:忽略宽字符常量中的无关字符[2]

这表明编译器认为在宽字符文本中有多个表示的代码点。例如,
L'ab'
。行为是实现定义的,clang和gcc都只使用最后一个代码点值

您显示的代码不应该触发这两种情况,至少在叮当声中是这样。第一个原因是这只适用于UCS,更不用说“呫”很容易适合单个16位wchar呫;第二个原因是源代码编码始终被视为UTF-8,并且它将“呫”的UTF-8多字节表示形式视为单个代码点。

您可以重新检查并确保源代码实际上是UTF-8。
$ uname -a
Darwin air 12.2.0 Darwin Kernel Version 12.2.0: Sat Aug 25 00:48:52 PDT 2012; root:xnu-2050.18.24~1/RELEASE_X86_64 x86_64
$ env | grep LANG
LANG=en_US.UTF-8
$ clang -v
Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.2.0
Thread model: posix
$ cat test.c
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    wchar_t c1 = 0;
    printf("sizeof(c1) == %lu\n", sizeof(c1));
    printf("sizeof(L'Я') == %lu\n", sizeof(L'Я'));
    if (c1 < L'Я') {
        printf("Я люблю часы Заря!\n");
    } else {
        printf("Что за....?\n");
    }
    return EXIT_SUCCESS;
}

$ clang -Wall -pedantic ./test.c 
$ ./a.out 
sizeof(c1) == 4
sizeof(L'Я') == 4
Я люблю часы Заря!
$ clang -Wall -pedantic ./test.c -fshort-wchar
$ ./a.out 
sizeof(c1) == 2
sizeof(L'Я') == 2
Я люблю часы Заря!
$