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

问题:

  1. 为什么在 Windows 上运行的 Clang 没有 C 一致性(__STDC__未定义为 1)?即,阻止“在 Windows 上运行的 Clang”定义__STDC__为 1 的(技术)障碍是什么?
  2. 需要指定哪些额外选项才能使 Clang C 在 Windows 上符合要求?
4

1 回答 1

0

事实证明, 的定义__STDC__取决于 clang 的分布。

@毫米

对我来说很好,目标 x86_64-w64-windows-gnu 。听起来您正在使用不合格的构建,也许您可​​以在从任何地方获得此构建的地方提交报告

感谢您对这个想法的确认。

在上面的测试clang version 11.0.1中使用过。它是从https://github.com/llvm/llvm-project/releases/tag/llvmorg-11.0.1LLVM-11.0.1-win64.exe中获得的。

相比之下,通过Cygwin安装程序 ( setup-x86_64.exe) 安装的 clang 显示 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

@克利福德

如果将测试更改为 #if STDC == 1 ||会发生什么 定义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

因此,由于某些(什么?)原因clang version 11.0.1fromLLVM-11.0.1-win64.exe未定义__STDC__为 1。

于 2021-04-06T10:14:46.870 回答