热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么在c99或c90模式下支持_Generic关键字?

如何解决《为什么在c99或c90模式下支持_Generic关键字?》经验,为你挑选了1个好方法。

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

int main() {
    int _Generic;
}

我在Ubuntu上用gcc-5.3.1clang-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`,而不是您尝试过的其他标识符.
推荐阅读
author-avatar
手机用户2502916627
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有