我编写了一个简单的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