简体   繁体   中英

Why Clang running on Windows has no C conformance (__STDC__ is not defined to 1)?

Sample code (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;
}

Invocation:

$ 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

Questions:

  1. Why Clang running on Windows has no C conformance ( __STDC__ is not defined to 1)? Ie what are the (technical) obstacles, which prevent "Clang running on Windows" to define __STDC__ to 1?
  2. Which extra options need to be specified to make Clang C conformant on Windows?

It turns out that the definition of __STDC__ depends on clang's distribution.

@MM

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

Thanks for the confirmation an for the idea.

In the test above clang version 11.0.1 was used. It was obtained from LLVM-11.0.1-win64.exe , which is shipped at https://github.com/llvm/llvm-project/releases/tag/llvmorg-11.0.1 .

In comparison clang installed via Cygwin installer ( setup-x86_64.exe ) shows C conformance:

$ 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

@Clifford

What happens if you change the test to #if STDC == 1 ||defined STDC_VERSION ?

#if __STDC__ == 1 || defined __STDC_VERSION__

Invocation:

$ /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

So, by some (what?) reason clang version 11.0.1 from LLVM-11.0.1-win64.exe does not define __STDC__ to 1.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM