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

变量函数是一些函数(例如printf),其中需要可变数量的参数。

可变参数函数的声明使用省略号作为最后一个参数,例如 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