GCC 编译C代码的相关选项
GCC 编译C代码的相关选项
来自
https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options
-ansi
1、等同于 -std=c90.[ C++语言,等同于 -std=c++98 ]
2、定义宏 __STRICT_ANSI__
3、alloca ffs 函数 不会再是 built-in 函数。见 Other built-in functions provided by GCC,
4、asm typeof inline 这几个关键字没有了【这是gnu90的扩展】
5、不再有 unix vax 宏定义。
6、依然具有 __asm__ __extension__ __typeof__ __inline__ 关键字和 __unix__ __vax__ 宏定义
6、使能 很少使用到的 三元字符组。
7、对于C语言,不再有 // 这个C++ 注释
-std=
版本 |
选项 |
说明 |
第一版标准 |
c89 c90 iso9899:1990 |
初始版本 1994 1996 年技术修订后的 |
第二版标准 |
iso9899:199409 |
AMD1 标准 增加:__STDC_VERSION__ 宏定义 增加:两元字符组 |
第三版标准 |
c99 iso9899:1999 |
|
第四版本标准 |
c11 iso9899:2011 c17 c18 iso9899:2017 iso9899:2018 |
c11 是标准 c17 是2017年准备好对C11的技术勘误,2018年发布。其实C17 和C18是指同一份技术勘误。 GCC 只支持 技术勘误后的标准。所有C11 C17 C18 是同一个东西。差别仅仅在宏定义 __STDC_VERSION__ 的值不同 |
-aux-info
将 函数声明 输出到
/* /usr/include/stdio.h:847:NC */ extern void funlockfile (FILE *); /* /usr/include/stdio.h:858:NC */ extern int __uflow (FILE *); /* /usr/include/stdio.h:859:NC */ extern int __overflow (FILE *, int); /* main.c:4:NF */ extern int add (int a, int b); /* (a, b) int a; int b; */ /* main.c:9:NF */ extern int main (void); /* () */ 1、 定义出现的行号 2、 I N (指示 new ) 或者 O (指示 old) 3、 C (declaration) 或者 F (definition) |
-fallow-parameterless-variadic-functions
先理解:variadic-function - 变量函数
http://www.verydoc.net/c/00000976.html 变量函数是一些函数(例如 可变参数函数的声明使用省略号作为最后一个参数,例如 int printf(const char * format,...);. 有关语法和自动参数转换的更多详细信息,请参阅可变参数。 从函数体访问可变参数使用以下库工具: |
再理解 parameterless variadic functions无参数的变量函数 ?
即,函数里面参数仅仅只有 … 这个可变参数,没有其他参数。这其实是没有意义的,因为(没有其他参数做为定位)进入函数实现后也无法读取到可变参数的。
-fno-asm
1、不再将 asm inline typeof 作为关键字。
2、-ansi 选项包含了 -fno-asm 选项
3、依然可以使用 __asm__ __inline__ __typeof__ 关键字
4、c99 模式下(-std=c99 or -std=gnu99) 这个选项仅仅 影响 asm typeof 关键字,不影响 inline ,因为inline 是 c99 标准中规定的关键字(不是gun的扩展)
-fno-builtin
-fno-builtin-function
不使用 以 __builtin_ 开头的内建函数。
1、 见 Other built-in functions provided by GCC, 获得GCC 内建函数的信息。
2、 内建函数 好处(执行更加高效),坏处(这下函数调用不再存在,无法调试,无法客制化这些函数)
3、 当GCC 识别到内建函数时,gcc 使用内建函数对应的 先验信息,利用这些先验信息来产生高效的代码。当printf 是内建函数时,调用printf 不当时,产生告警。
4、 使用了 -fno-builtin 或者 -ffreestanding 时,怎么使能 内建函数呢 ?可以使用宏定义。
#define abs(n) __builtin_abs ((n))
#define strcpy(d, s) __builtin_strcpy ((d), (s))
5、-fno-builtin-function 选项,function 这个函数名称,不能以 __builtin_ 开头; 如果function 函数本身就不是内建函数,这个选项被忽略。
-fcond-mismatch
允许条件表达式的 第2 3 个参数具有不同的类型。
-ffreestanding
编译输出(可执行文件)是运行在一个 freestanding environment 环境下。
这个选项 包含 -fno-builtin 选项。
等同于 -fno-hosted
-fgimple
实验性功能
解析 __GIMPLE 标识的函数定义。
-fgnu-tm
使用 Intel 的 Transactional Memory API specification 的linux 变种。
备注: transactional memory 功能必须要 call exception 功能。即,打开-fno-call-exceptions 后,就无法使用 transactional memory 功能。
-fgnu89-inline
在 c99 模式下,使用 传统的 gnu 的 inline 语法。
-fno-gun89-inline ,使用 C99 标准的 inline 语法。
默认使用 c99 的inline 语法
-fhosted
生成的可执行程序,运行的 hosted environment 环境下。
-flax-vector-conversions
允许 隐式的 不同元素个数的,数据类型不兼容的 vector 之间的转换。
新代码中不要使用这个选项。
-fms-extensions
允许 Microsoft 头文件中的,非标准的 构造函数。
这个选项 只有在 ms x86 平台上面才会开启。
offload
-foffload=disable
-foffload=default
-foffload=target-list
-foffload-options=options
-foffload-options=target-triplet-list=options
见 https://gcc.gnu.org/wiki/Offloading
openaac
-fopenacc
-fopenacc-dim=geom
openmp
-fopenmp
-fopenmp-simd
-fpermitted-flt-eval-methods=c11 或ts-18661-3
浮点数 计算 取值 方法
详见
https://www.w3cschool.cn/doc_c/c-types-limits-flt_eval_method.html
-fplan9-extensions
这个选项 会 包含 -fms-extensions
-fxxsigned-bitfields
bitfield 定义,默认是 有符号还是无符号,
默认是 有符号的
-fxxsigned-char
char 定义是有符号还是无符号的。
-fsso-struct=native|big-endian|little-endian
结构体存储时,按照大端还是小端顺序。默认 native