作者:手机用户2502916627 | 来源:互联网 | 2023-02-01 09:11
我写了一个简单的C程序来测试_Generic关键字的可用性.
int main() {
int _Generic;
}
我在Ubuntu上用gcc-5.3.1和clang-3.8.0编译器运行程序.
显然,当使用最新的c11标准编译时,该程序会产生错误.
但是,当使用-std = c90和-std = c99标志进行编译时,它也会生成错误.然而,_Generic关键字仅在c11标准中引入.
这是-std = flags的行为不同吗?有没有办法测试纯c90和c99标准?
编辑:
我确实使用其他标识符运行相同的程序,这些标识符不是c11标准的关键字.喜欢:
int _Hello;
int _Gener;
他们成功编译没有任何错误或警告.这可能是因为7.1.3,它说
如果程序在保留它的上下文中声明或定义标识符(除了7.1.4允许的标识符),或者将保留标识符定义为宏名称,则行为未定义
正如@Art和@Lundin所说.
1> Lundin..:
因为不允许使用以下划线开头的标识符,后跟大写字母.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
@AseemSharan,确切地说它是未定义的,意思是它所说的,没有定义.所以编译器可能会对你的代码感到满意.鉴于C11,它们已经使用`_Generic`,而不是您尝试过的其他标识符.