为什么 Windows 上的 Clang 运行 不符合 C(__STDC__ 未定义为 1)?
Why Clang running on Windows has no C conformance (__STDC__ is not defined to 1)?
示例代码(t127.c):
#include <stdio.h>
int main(void)
{
int ret;
#if __STDC__ == 1
printf("Has C conformance to version ");
#if __STDC_VERSION__
printf("%ld", __STDC_VERSION__);
#else
printf("1989");
#endif
printf(" OR has no C conformance but __STDC__ is defined to 1\n");
ret = 0;
#else
printf("Has no C conformance\n");
ret = 1;
#endif
return ret;
}
调用:
$ clang t127.c -std=c11 -Wall -Wextra -pedantic && ./a.exe
Has no C conformance
# comparison with gcc
$ gcc t127.c -std=c11 -Wall -Wextra -pedantic && ./a.exe
Has C conformance to version 201112 OR has no C conformance but __STDC__ is defined to 1
$ clang --version
clang version 11.0.1
Target: x86_64-pc-windows-msvc
Thread model: posix
$ gcc --version
gcc (GCC) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ systeminfo
OS Name: Microsoft Windows 10 Pro
OS Version: 10.0.19041 N/A Build 19041
问题:
- 为什么 Windows 上的 Clang 运行 不符合 C(
__STDC__
未定义为 1)? IE。什么(技术)障碍阻止“Windows 上的 Clang 运行”将 __STDC__
定义为 1?
- 需要指定哪些额外选项才能使 Clang C 符合 Windows?
原来__STDC__
的定义依赖于clang的分布
@M.M
works fine for me, target x86_64-w64-windows-gnu . Sounds like you are using a non-conforming build, perhaps you could file a report with wherever you got this build from
感谢您的确认和想法。
在上面的测试中使用了clang version 11.0.1
。它是从 LLVM-11.0.1-win64.exe
获得的,发货时间为 https://github.com/llvm/llvm-project/releases/tag/llvmorg-11.0.1。
比较通过 Cygwin 安装程序安装的 clang (setup-x86_64.exe
) 显示 C 一致性:
$ clang t127.c -std=c11 -Wall -Wextra -pedantic && ./a.exe
Has C conformance to version 201112 OR has no C conformance but __STDC__ is defined to 1
$ clang --version
clang version 8.0.1 (tags/RELEASE_801/final)
Target: x86_64-unknown-windows-cygnus
Thread model: posix
@克利福德
What happens if you change the test to #if STDC == 1 || defined STDC_VERSION?
#if __STDC__ == 1 || defined __STDC_VERSION__
调用:
$ /cygdrive/d/LLVM/11.0.1/bin/clang t127.c -std=gnu11 -Wall -Wextra -pedantic && ./a.exe
Has C conformance to version 201112 OR has no C conformance but __STDC__ is defined to 1
所以,出于某些(什么?)原因,LLVM-11.0.1-win64.exe
中的 clang version 11.0.1
没有将 __STDC__
定义为 1.
示例代码(t127.c):
#include <stdio.h>
int main(void)
{
int ret;
#if __STDC__ == 1
printf("Has C conformance to version ");
#if __STDC_VERSION__
printf("%ld", __STDC_VERSION__);
#else
printf("1989");
#endif
printf(" OR has no C conformance but __STDC__ is defined to 1\n");
ret = 0;
#else
printf("Has no C conformance\n");
ret = 1;
#endif
return ret;
}
调用:
$ clang t127.c -std=c11 -Wall -Wextra -pedantic && ./a.exe
Has no C conformance
# comparison with gcc
$ gcc t127.c -std=c11 -Wall -Wextra -pedantic && ./a.exe
Has C conformance to version 201112 OR has no C conformance but __STDC__ is defined to 1
$ clang --version
clang version 11.0.1
Target: x86_64-pc-windows-msvc
Thread model: posix
$ gcc --version
gcc (GCC) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ systeminfo
OS Name: Microsoft Windows 10 Pro
OS Version: 10.0.19041 N/A Build 19041
问题:
- 为什么 Windows 上的 Clang 运行 不符合 C(
__STDC__
未定义为 1)? IE。什么(技术)障碍阻止“Windows 上的 Clang 运行”将__STDC__
定义为 1? - 需要指定哪些额外选项才能使 Clang C 符合 Windows?
原来__STDC__
的定义依赖于clang的分布
@M.M
works fine for me, target x86_64-w64-windows-gnu . Sounds like you are using a non-conforming build, perhaps you could file a report with wherever you got this build from
感谢您的确认和想法。
在上面的测试中使用了clang version 11.0.1
。它是从 LLVM-11.0.1-win64.exe
获得的,发货时间为 https://github.com/llvm/llvm-project/releases/tag/llvmorg-11.0.1。
比较通过 Cygwin 安装程序安装的 clang (setup-x86_64.exe
) 显示 C 一致性:
$ clang t127.c -std=c11 -Wall -Wextra -pedantic && ./a.exe
Has C conformance to version 201112 OR has no C conformance but __STDC__ is defined to 1
$ clang --version
clang version 8.0.1 (tags/RELEASE_801/final)
Target: x86_64-unknown-windows-cygnus
Thread model: posix
@克利福德
What happens if you change the test to #if STDC == 1 || defined STDC_VERSION?
#if __STDC__ == 1 || defined __STDC_VERSION__
调用:
$ /cygdrive/d/LLVM/11.0.1/bin/clang t127.c -std=gnu11 -Wall -Wextra -pedantic && ./a.exe
Has C conformance to version 201112 OR has no C conformance but __STDC__ is defined to 1
所以,出于某些(什么?)原因,LLVM-11.0.1-win64.exe
中的 clang version 11.0.1
没有将 __STDC__
定义为 1.