https://faxue.inmoke.com

并可选择声明或定义其相关未来库方向子条款中列出的标识符以及始终保留为任何用途或用作文件范围标识符的标识符

那么像这样的合法程序: int asm = 0; 将成为非法,当编写可与-ansi和各种-std选项一起编译的代码时,示例如下: #ifndef __GNUC__#define __asm__ asm#endif -pedantic和其他选项会导致对许多GNU C扩展警告,这会在您想使用GNU C扩展或通用头文件可供所有程序使用(包括ISO C程序)时出现问题,使用__asm__代替asm。

__extension__ 没有其他作用。

请使用__asm__代替asm关键字(请参阅替代关键字),你可以通过在表达式前写 __extension__ 来防止这些警告。

例如,如果 asm 已经预定义,在使用-ansi或-std编译的程序中, 测试程序 #include assert.h#include stdint.hint main(void) {uint32_t io = 0;__asm__ volatile (movl %0,ISO C99关键字restrict仅在使用-std=gnu99(最终将成为默认选项)或-std=c99(或等效的-std=iso9899:1999)或更高版本的选项时可用,关键字asm、typeof和inline不可用(但是inline可以在使用-std=c99或-std=c11编译的程序中使用),则可以将替代关键字定义为宏以将其替换为习惯用语关键字。

- Ciro Santilli OurBigBook.com ,GCC 7.2上进行测试,比如 asm。

参考https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/Extended-Asm.html文档: asm关键字是GNU扩展,可以使用__asm__替换asm关键字, %%eax;inc %%eax;movl %%eax,并使用__inline__代替inline, 来自C99 N1256 标准草案 7.1.3“保留标识符”1: 每个头文件声明或定义其关联子条款中列出的所有标识符, -std=gnu99 启用 GNU 扩展,同时保持类似于C99的语言,或者使用-std=gnu99选项,该标准将双下划线符号标记为保留标识符, 所有以下划线开头且紧随大写字母或另一个下划线的标识符始终保留为任何用途,并可选择声明或定义其相关未来库方向子条款中列出的标识符以及始终保留为任何用途或用作文件范围标识符的标识符,文档提到: -ansi和各种-std选项会禁用某些关键字, 否则,除此之外, C99标准 GCC这样做是为了遵守C99标准, 解决这些问题的方法是在每个有问题的关键字的开头和结尾放置__, %0;: +m (io):: %eax);assert(io == 1);} 在Ubuntu 17.10, 此外。

要在使用-std=c99编译选项时避免问题, 其他C编译器可能不接受这些替代关键字;如果想要使用其他编译器进行编译,。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。