为什么在c99或c90模式下支持_Generic关键字? [英] Why is _Generic keyword supported in c99 or c90 modes?

查看:137
本文介绍了为什么在c99或c90模式下支持_Generic关键字?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I wrote a simple C program to test the availability of _Generic keyword.

int main() {
    int _Generic;
}

我用 gcc-5.3.1运行了程序>和 clang-3.8.0 在Ubuntu上进行编译。

I ran the program with gcc-5.3.1 and clang-3.8.0 compilers on Ubuntu.

很明显,该程序在最新的c11标准中编译时会产生错误。

Obviously this program generated an error when compiled in the latest c11 standard.

但是,当使用 -std = c90 -std = c99 标志进行编译时,也会产生错误。 _Generic关键字仅在c11标准中引入。

But, when compiled with -std=c90 and -std=c99 flags, it generated an error as well. Whereas, the _Generic keyword was only introduced in c11 standard.

-std =标志的行为是否不同?有没有一种方法可以测试纯c90和c99标准?

Is it that the -std= flags behave differently? And is there a way to test the pure c90 and c99 standards?

EDIT:

我确实使用相同的标识符(不是c11标准的关键字)运行同一程序。像这样:

I did run the same program with other identifiers which are not keywords as per c11 standard. Like:

int _Hello;
int _Gener;

它们成功编译,没有任何错误或警告。
这可能是因为7.1.3,它表示

And they compiled successfully without any errors or warnings. This is probably because of 7.1.3, which says


如果程序在$ b $中声明或定义了标识符,在保留它的上下文中(除非7.1.4允许),或者将保留的
标识符定义为宏名,该行为是未定义的

If the program declares or defines an identifier in a context in which it is reserved (other than as allowed by 7.1.4), or defines a reserved identifier as a macro name, the behavior is undefined

,如@Art和@Lundin所说。

as said by @Art and @Lundin.

推荐答案

因为不允许使用以下划线和大写字母开头的标识符。 7.1.3:

Because you are not allowed to use identifiers that start with an underscore followed by an upper-case letter. 7.1.3:


所有以下划线开头,大写
字母或其他下划线开头的标识符始终保留给任何

All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.

此规则自C90起就存在,并不是什么新鲜事。

This rule has been there since C90 and is nothing new.

一种更可靠的测试标准版本的方法是使用为此目的定义的标准宏:

A more reliable way to test for standard version would be to use the standard macros defined for that very purpose:

#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

这篇关于为什么在c99或c90模式下支持_Generic关键字?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆