Linux 中的 cpp 命令和示例
cpp是 C 语言预处理器,您的 C 编译器会自动使用它在编译前转换您的程序。它也被称为宏处理器,因为它用于为较长的代码段提供缩写。它只能与 C、C++ 和 Objective-C 源代码一起使用。与其他编程语言一起使用可能会导致不确定的问题。
句法:
cpp [-options] infile outfile
一些重要选项:
- -D名称:预定义的名字作为宏。
- -D name=definition :定义的内容被标记化和处理,就好像它们写在程序本身中一样。
- -U name : 取消任何以前的宏定义。
- -undef :不要预定义任何特定于系统或特定于 GCC 的宏。标准的预定义宏保持定义。
- -I dir :将目录 dir 添加到要搜索头文件的目录列表中。
- -Wall :打开正常代码所需的所有可选警告。
- -Wcomments :每当注释开始序列 /* 出现在 /* 注释中,或者当反斜杠换行出现在 // 注释中时发出警告。
- -Wendif-labels :当 #else 或 #endif 后跟文本时发出警告。
- -w :禁止所有警告,包括默认情况下 GNU CPP 发出的警告。
- -M :不输出预处理的结果,输出一个适合make描述主源文件依赖关系的规则。
- -MM :类似于 -M 但不提及在系统头目录中找到的头文件。
- -xc
- -x c++
- -x 目标-c
- -x assembler-with-cpp :以上四个都指定源语言:C、C++、Objective-C 或汇编。这与标准一致性或扩展无关;它只是选择期望的基本语法。
示例:我们创建了两个代码来解释我们将它们称为code_a.c和code_b.c 的概念。
#include
void main()
{
printf("Hello, World!");
}
code_a.c
#include
void main()
{
printf(out);
}
code_b.c
- 使用 cpp 命令:
它将导致以下输出:
# 1 "code_a.c" # 1 "" # 1 "" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "" 2 # 1 "code_a.c" # 1 "/usr/include/stdio.h" 1 3 4 # 27 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/features.h" 1 3 4 # 367 "/usr/include/features.h" 3 4 # 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4 # 410 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4 # 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4 # 411 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4 # 368 "/usr/include/features.h" 2 3 4 # 391 "/usr/include/features.h" 3 4 .......... ............. .................... # 2 "code_a.c" void main() { printf("Hello, World!"); }
输出太大,我们实际上不需要它来理解这个概念。我们理解的是,它只是简单地将头文件中的整段代码调用并替换到程序中。
- 使用 -D 选项:
# 1 "code_b.c" # 1 "" # 1 "" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "" 2 # 1 "code_a.c" # 1 "/usr/include/stdio.h" 1 3 4 # 27 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/features.h" 1 3 4 # 367 "/usr/include/features.h" 3 4 # 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4 # 410 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4 # 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4 # 411 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4 # 368 "/usr/include/features.h" 2 3 4 # 391 "/usr/include/features.h" 3 4 .......... ............. .................... # 2 "code_b.c" void main() { printf("Hello, World!"); }
观察它打印出相同的结果。这是因为它使用了我们在命令行中声明的宏。
- 使用-M选项:
观察到差异。这是因为它只输出make所需的规则。