当前位置: 首页 > 知识库问答 >
问题:

gcc标志-编译.i或.ii文件时忽略include

太叔烨霖
2023-03-14

我最近发现如果文件结尾是.I或.ii,gcc会跳过预处理,于是决定试试看。编译不包含stdio.h的hello world程序:

gcc -Wall file.c; # compiles with preprocessor, implicit declaration of puts
gcc -Wall file.i; # compiles without preprocessor, implicit declaration of puts 
gcc -Wall -include stdio.h file.c; # no warnings, "hello world". hooray
gcc -Wall -include stdio.h file.i; # implicit declaration of puts WAIT WHAT?!

为什么不起作用?

GCC版本6.3.0。

共有1个答案

齐学文
2023-03-14

-include列在预处理器选项下:

3.12控制预处理器的选项

这些选项控制C预处理器,该预处理器在实际编译之前运行在每个C源文件上。

[...]

-包含文件

处理文件,就好像#include“file”出现在主源文件的第一行。[...]

但是,对于.i文件,预处理器从不运行,因此该选项不起作用。

GCC一般不会对没有效果的选项发出警告。您还可以运行gcc-wall-funsigned-char foo.o,它甚至不调用编译器。-wall-funsigned-char被简单忽略。

您可以将编译看作是一个管道:

  1. C代码(.c)通过预处理器,预处理器产生...
  2. 预处理的C代码(.i),由生成...
  3. 的编译器处理
  4. 汇编程序代码(.s),由生成...
  5. html" target="_blank">汇编程序处理
  6. 目标代码(.o),由链接器处理,提供...
  7. 可执行文件。

可以使用选项告诉GCC停止的位置:

  • -P预处理后停止
  • -s编译后停止
  • -C组装后停止

其他选项被传递到管道中的相应阶段。如果管道的那一部分从未运行,就不会发生任何事情。

 类似资料:
  • 忽略编译器警告 格式 #pragma clang push #pragma clang diagnostic ignored "错误类型" // 存在警告的代码 #pragma clang pop > 1.在需要忽略的警告处右键 -- Reveal in Log 2.会给出警告的详细信息,其中包括警告的类型 3.高亮选中的便是这个警告的类型 4.在警告代码处增加如下代码 Command

  • 成功编译我的TypeScript项目后,我打算使用< code>ts-node在VS Code的调试模式下运行它。问题是,< code>ts-node找不到我创建的< code>d.ts文件(而< code>tsc对此没有问题)。 项目结构为: < code>tsconfig.json相关条目有: 找不到的定义文件是 : 因此,尝试使用< code>ts-node运行它时,我看到: 如何全球化解?

  • 编译标志 编译标志让你可以修改正则表达式的一些运行方式。在 re 模块中标志可以使用两个名字,一个是全名如 IGNORECASE,一个是缩写,一字母形式如 I。(如果你熟悉 Perl 的模式修改,一字母形式使用同样的字母;例如 re.VERBOSE的缩写形式是 re.X。)多个标志可以通过按位 OR-ing 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志: 这有个可用标志表,对

  • 问题 你想使用原始文件名执行文件的I/O操作,也就是说文件名并没有经过系统默认编码去解码或编码过。 解决方案 默认情况下,所有的文件名都会根据 sys.getfilesystemencoding() 返回的文本编码来编码或解码。比如: >>> sys.getfilesystemencoding() 'utf-8' >>> 如果因为某种原因你想忽略这种编码,可以使用一个原始字节字符串来指定一个文件名

  • 主要内容:gcc -S指令我们知道,从 C、C++源代码生成可执行文件需要经历 4 个过程,分别为预处理、编译、汇编和链接。其中,《 GCC -E选项:对源程序做预处理操作》一节以 demo.c 源程序文件为例,演示了如何使用 GCC 执行预处理操作,并生成了相应的 demo.i 预处理文件。 [root@bogon demo]# cat demo.c #include <stdio.h> int main(){    p

  • 我的班级的自动评分员使用gcc来为我们的项目评分,它只需要文件上传(.cpp.h),学生不能传入任何参数标志。我的项目使用g编译,没有问题: g 主.cpp函子1.cpp函子2.cpp函子1.h -o a.out 但是对于gcc,我必须在最后添加-lstdc才能编译: gcc main . CPP func 1 . CPP func 2 . CPP func 1 . h-o a . out-lst