GCC命令详解与实践(三) -- C语言控制选项

在开始这一章之前,我们先了解两个概念: C的派生语言和C的子集

C的派生语言指的是从C语言衍生出来的编程语言, 如C++, Objective-C和Objective-C++。

C的子集指的是K&R C,ANSI C(即C89),C90(即ISO C),C99,C11。其中除了标准文档在印刷编排上的某些细节不同外,ISO C(C90) 和 ANSI C(C89) 在技术上完全一样。 具体可以参考我的这篇文章《C语言介绍》

本章所讲的编译选项的作用就是控制编译器根据指定的C派生语言或者子集进行编译。

下面介绍几种常用的C派生语言选项。

gcc -ansi

用法:gcc -ansi <filename>
作用: 在C模式下,这相当于-std=c90。在c++模式下相当于-std=c++98。
该选项将关闭GCC不兼容ISO C90(编译C代码时)或标准c++(编译c++代码时)的某些特性,比如asm和typeof关键字。对于C语言编译,它不识别C++风格的'//'注释和内联关键字inline
例如:

gcc -ansi foo.c

gcc -std

用法:gcc -std=<standard> <filename>

作用: 该选项的作用是确定编译器按照哪个C标准进行编译。可以是c89,c90和c11等等。

例如:

gcc -std=c90 foo.c

-std=中的可以是以下的这些值:

  1. 支持ISO C90的标准,类似-ansi
'c90'
'c89'
'iso9899:1990'

2.支持ISO C99的标准

'c99'
'c9x'
'iso9899:1999'
'iso9899:199x'
  1. 支持ISO C11, ISO C标准2011年修订版
'c11'
'c1x'
'iso9899:2011'
  1. ISO C17, ISO C标准2017年修订版(2018年发布)
'c17'
'c18'
'iso9899:2017'
'iso9899:2018'
  1. 还有支持ISO C标准中派生出来的GNU标准
'gnu90'
'gnu89'
'gnu99'
'gnu9x'
'gnu11'
'gnu1x'
'gnu17'
'gnu18'

gcc -fno-asm

用法:gcc -fno-asm <filename>

作用: 不将asm、inline或typeof识别为关键字,因此代码可以使用这些词作为标识符。既然前面这> 些关键词不能用,那怎么办?GCC提供了替代方案,我们可以使用__asm__, inline
__typeof__替代,-ansi默认是打开了-fno-asm选项。

例如:

gcc -fno-asm foo.c

gcc -funsigned-char

用法:gcc -funsigned-char <filename>

作用: 让char类型是无符号的,即char就是unsigned char。每种机器都有一个char的默认值。它在默认情况下可以是 unsigned char或者signed char。

例如:

gcc -funsigned-char

-funsigned-char选项,同样也有-fsigned-char,它的作用是让char类型是有符号的,即char就是signed char。

gcc -fsso-struct

用法:gcc -fsso-struct= <filename>

作用: 将结构体和联合体的默认存储顺序设置为指定的可以是'big-endian', 'little-endian' 和 'native'。如果参数设为了'native',那么存储方式就跟机器(芯片)默认存储有关。

例如:

gcc -fsso-struct=big-endian

以上就是常用的一些C语言控制选项,当然还有许多其他的选项,如果想深入了解,可以到官网了解更多细节的内容。

下一节