gcc -E xx.c
C语言代码在交给编译器之前,会先由预处理器进行一些文本替换方面的操作,例如宏展开、文件包含、删除部分代码等。
在正常的情况下,GCC 不会保留预处理阶段的输出文件,也即.i
文件。然而,可以利用-E
选项保留预处理器的输出文件,以用于诊断代码。-E
选项指示 GCC 在预处理完毕之后即可停止。
默认情况下,预处理器的输出会被导入到标准输出流(也就是显示器),可以利用-o
选项把它导入到某个输出文件:
$ gcc -E circle.c -o circle.i
表示把预处理的结果导出到 circle.i 文件。
因为头文件可能相当大,如果源文件包括了多个头文件,那么它的预处理器输出可能会庞杂难读。使用-C
选项会很有帮助,这个选项可以阻止预处理器删除源文件和头文件中的注释:
$ gcc -E -C circle.c -o circle.c
注意,这里是大写的 -C,不是小写的 -c。小写的 -c 表示只编译不链接。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面是 GCC 预处理器阶段常用的选项:
-Dname[=definition]
在处理源文件之前,先定义宏 name。宏 name 必须是在源文件和头文件中都没有被定义过的。将该选项搭配源代码中的#ifdef name
命令使用,可以实现条件式编译。如果没有指定一个替换的值,该宏被定义为值 1。
-Uname
如果在命令行或 GCC 默认设置中定义过宏 name,则“取消”name 的定义。-D
和-U
选项会依据在命令行中出现的先后顺序进行处理。
-Idirectory[:directory[...]]
当通过 #include 命令把所需的头文件包括进源代码中时,除系统标准 include 目录之外,指定其他的目录对这些头文件进行搜索。
-iquote directory[:directory[...]]
这是在最近 GCC 版本中新增的选项,它为在 #include 命令中采用引号而非尖括号指定的头文件指定搜索目录。
-isystem directory[:directory[...]]
该选项在标准系统 include 目录以外为系统头文件指定搜索目录,且它指定的目录优先于标准系统 include 目录被搜索。在目录说明开头位置的等号,被视作系统根目录的占位符,可以使用--sysroot
或-isysroot
选项来修改它。
-isysroot directory
该选项指定搜索头文件时的系统根目录。例如,如果编译器通常在 /usr/include 目录及其子目录下搜索系统头文件,则该选项将引导到 directory/usr/include 及其子目录下进行搜索。
--sysroot
选项,采用一个连字符替代 i,它为链接库搜索而不是头文件搜索指定系统根目录以外的目录。如果 isysroot 不可用,则 sysroot 既为头文件又为链接库搜索指定目录。
-I-
在较新版本的 GCC 中,该选项被-iquote
替代。在旧版本中,该选项用于将命令行的所有-Idirectory
选项分割为两组。所有在-I-
左边加上-I
选项的目录,被视为等同于采用-iquote
选项;这指的是,它们只对 #include 命令中采用引号的头文件名进行搜索。
所有在-I-
右边加上-I
选项的目录,将对所有 #include 命令中的头文件名进行搜索,无论文件名是在引号还是尖括号中。
而且,如果命令行中出现了-I-
,那么包括源文件本身的目录不再自动作为搜索头文件的目录。
对于include目录而言,通常的搜索顺序是:
- 包含指定源文件的目录(对于在 #include 命令中以引号包括的文件名)。
- 采用
-iquote
选项指定的目录,依照出现在命令行中的顺序进行搜索。只对 #include 命令中采用引号的头文件名进行搜索。 - 采用
-I
选型指定的目录,依照出现在命令行中的顺序进行搜索。 - 采用环境变量 CPATH 指定的目录。
- 采用
-isystem
选项指定的目录,依照出现在命令行中的顺序进行搜索。 - 采用环境变量 C_INCLUDE_PATH 指定的目录。
- 系统默认的 include 目录。
gcc -E xx.c的更多相关文章
- gcc -S xx
编译器的核心任务是把C程序翻译成机器的汇编语言(assembly language).汇编语言是人类可以阅读的编程语言,也是相当接近实际机器码的语言.由此导致每种 CPU 架构都有不同的汇编语言. 实 ...
- gcc -c xx.c 选项讲解
-c选项表示编译.汇编指定的源文件(也就是编译源文件),但是不进行链接.使用-c选项可以将每一个源文件编译成对应的目标文件. 目标文件是一种中间文件或者临时文件,如果不设置该选项,gcc 一般不会保留 ...
- GCC related commands
GCC -l option is to link the library. It can use for static and share link. Link -l with library ...
- gcc 常用命令
gcc编译器 $ gcc -o XX.exe XXX.c ddd.c $ gcc -o XX.asm -S XXX.c 编译生成可执行文件,并执行程序,缺省的时候,gcc 编译出来的文件是a.out ...
- GCC/GDB学习
GCC学习 1.gcc是根据后缀名来区分文件的 .c : c语言源文件 .a : 目标文件构成的库文件 .C/.cc/.cxx : c++源文件 .h : 头文件 .i : 预处理过的C源文件 .ii ...
- 标准IO的简单应用,动静态库,读取系统时间并打印,模拟ls -l功能
2015.2.27星期五,小雨 标准IO实现的复制功能: #include <stdio.h>#include <errno.h> #define N 64 int main( ...
- linux 命令及进程控制
main.c main.o/main.obj main/main.exe 编译 连接 程序运行; 两步: gcc/g++ -c mai ...
- ELF分析 实践
分析ELF文件: 首先编写一个.c文件,并使用gcc -c xx.c -o xx.o 对其进行编译. 我在这个实践中是ELF_1.o文件. 接下来输入ls -l ELF_1.o 查看重定位文件的信息. ...
- 第八周课上测试ch03
测试-1-ch03 任务详情 通过输入gcc -S -o main.s main.c,将下面c程序"week04学号.c"编译成汇编代码 int g(int x){ return ...
随机推荐
- Fedora 32大变化:将删除Python 2及其软件包
导读 虽然Fedora 30还没有上市,Fedora 32直到大约一年后才上市,但我们已经知道一个很大的变化:删除Python 2和包依赖它.随着Fedora 32将于2020年上半年推出,超过了Py ...
- Q3狂揽3亿美元净利润的特斯拉会让国内电动汽车厂商喜极而泣吗?
作为电动汽车行业的标杆,特斯拉无疑是国内电动汽车厂商发展进程中重要的参考对象.而前段时间特斯拉身上出现的产能受阻.私有化风波.马斯克卸任董事长一职等事件,着实让国产电动汽车厂商惊出一身冷汗.毕竟如果特 ...
- C++基础--随机数
C/C++要产生随机数的方法一般是采用rand()函数核srand()函数来实现的. rand()函数返回的是一个伪随机数,这个函数内部采用线性同余法来实现伪随机数,而这个伪随机数是在一定范围内可以看 ...
- python *args 和 ** kwargs
可变长度的参数 *args的使用方法 *args 用来将参数打包成tuple给函数体调用 可见,1这个参数,被打包成了一个元组 def func(*args): print(args,type(arg ...
- 《Thinking in Java》位运算
按位操作符: 首先先记住一件事,方便理解:是否对应正负对应10. 1.与(&):11得1,10得0,00得0. 2.或(|):11得1,10得1,00得0. 3.异或(^):11得0,10得1 ...
- P1426 小鱼会有危险吗
题解: 在测试数据里有一个是临界值问题,探测范围是闭区间 #include<stdio.h>int main(){ double s,x; //注意:此 ...
- HashMap核心功能源码浅析
1.引子 "HashMap"由“hash”和“map"两个单词组成,这里的”map"表示“映射”而不是“地图”的意思,两个单词连起来就是“哈希映射表”.Map是 ...
- 面向对象变成(OOP)-创建类和使用类
1.1.1对象的抽象:抽象是一种归纳或总结,对象是现实世界物体特征的实例. (1)一切皆是对象. (2)类是对象的抽象. 1.1.2 对象的使用: 当对象被抽象为类以后,就可以创建具体的实例来操作了. ...
- C++ 操作数据库类
#pragma once #include <string> #include <windows.h> #include <algorithm> #include ...
- 洛谷 P2196 挖地雷
题目传送门 解题思路: 记忆化搜索,题目比较坑的地方在于,这是个有向图,给的边是单向边!!!!!!!! AC代码: #include<iostream> #include<cstdi ...