我最近发现如果文件结尾是.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。
-include
列在预处理器选项下:
3.12控制预处理器的选项
这些选项控制C预处理器,该预处理器在实际编译之前运行在每个C源文件上。
[...]
-包含文件
处理文件,就好像#include“file”
出现在主源文件的第一行。[...]
但是,对于.i
文件,预处理器从不运行,因此该选项不起作用。
GCC一般不会对没有效果的选项发出警告。您还可以运行gcc-wall-funsigned-char foo.o
,它甚至不调用编译器。-wall
和-funsigned-char
被简单忽略。
您可以将编译看作是一个管道:
.c
)通过预处理器,预处理器产生....i
),由生成....s
),由生成....o
),由链接器处理,提供...可以使用选项告诉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