gcc, vc 编译输出头文件包含顺序

g++ -H 打印头文件包含顺序和有效性

作者: dzqabc

博客: https://www.cnblogs.com/dongzhiquan/archive/2013/04/11/3013486.html

发布: 2013-04-11 00:24

g++ -H 选项

有时为定位一些如头文件循环包含致编译不过问题,我们要知道头文件包含顺序。

g++ -H 除了进行正常编译,还会打印每个头文件的名称。每个文件通过缩进表示它在包括堆栈中的深度。无效的预编译头文件也会打印出来;无效的预编译头文件打印…x,有效的打印…!

参考&示例

vc++ 中相似的编译选项

/showIncludes (https://docs.microsoft.com/zh-cn/cpp/build/reference/showincludes-list-include-files?view=vs-2019)

  • 编译器的输出包含文件列表,嵌套的包含文件可以显示包括文件中的包含文件
  • 语法
    /showIncludes
    
  • 在 Visual Studio 开发环境中设置此编译器选项
    • 打开项目的“属性页” 对话框。
    • 单击 “C/C++” 文件夹。
    • 单击高级属性页。
    • 修改显示包含属性。




gcc -E 生成预处理文件

作者: 心田居士

博客: https://www.cnblogs.com/liuzhenbo/p/11030852.html

RSS: http://c.biancheng.net/view/2375.html

发布: 2019-06-16 10:58

-E 选项, 保留预处理器的输出文件

C语言代码在交给编译器之前,会先由预处理器进行一些文本替换方面的操作,例如宏展开、文件包含、删除部分代码等。

在正常的情况下,GCC 不会保留预处理阶段的输出文件,也即.i文件。然而,可以利用-E选项保留预处理器的输出文件,以用于诊断代码。-E选项指示 GCC 在预处理完毕之后即可停止。

默认情况下,预处理器的输出会被导入到标准输出流(也就是显示器),可以利用-o选项把它导入到某个输出文件:

$ gcc -E circle.c -o circle.i  # 表示把预处理的结果导出到 circle.i 文件。

-C 选项, 阻止预处理器删除文件中的注释

因为头文件可能相当大,如果源文件包括了多个头文件,那么它的预处理器输出可能会庞杂难读。使用-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 目录。

更多示例

猜你喜欢

转载自blog.csdn.net/hylaking/article/details/107063802