我编写了一个简单的C程序来测试泛型关键字的可用性。

int main() {
    int _Generic;
}

我在Ubuntu上用gcc-5.3.1和clang-3.8.0编译器运行了这个程序。
显然,这个程序在用最新的c11标准编译时产生了一个错误。
但是,当使用-std=c90和-std=c99标志编译时,它也会生成一个错误。然而,泛型关键字只在c11标准中引入。
是不是-std=标志的行为不同?还有测试纯c90和c99标准的方法吗?
编辑:
我确实运行了同一个程序,其他标识符不是符合c11标准的关键字。比如:
int _Hello;
int _Gener;

而且它们编译成功,没有任何错误或警告。
这可能是因为7.1.3,它说
如果程序在
保留(7.1.4允许的除外)或定义保留的上下文
标识符作为宏名,行为未定义
正如“艺术”和“伦丁”所说。

最佳答案

因为不允许使用以下划线后跟大写字母开头的标识符。7.1.3:
以下划线和大写字母开头的所有标识符
字母或其他下划线始终保留供任何使用。
这条规则从C90开始就存在了,并不是什么新鲜事。
测试标准版本的更可靠方法是使用为此目的定义的标准宏:

#ifndef __STDC__
  #error Not a standard C compiler.
#endif

#ifdef __STD_VERSION__
  #if (__STDC_VERSION__ == 199409L)
    /* C95 */
  #elif (__STDC_VERSION__ == 199901L)
    /* C99 */
  #elif (__STDC_VERSION__ == 201112L)
    /* C11 */
  #else
    /* Cxx, unknown future standard */
  #endif
#else /* __STDC__ defined but not __STD_VERSION__ */
  /* C90 */
#endif

08-16 23:21