理论问题:C 预处理器的语言格式到底是什么。我知道它的作用,它的用途,当它被调用时,但如果它的输出是:a)汇编代码,b)C源代码(据说它看起来像它)或c),我无法找到任何地方机器语言(我不认为这是它,而是一个猜测)。
嗯,它是一个与 C 编译器相关的 预处理器...任何地方都可能需要搜索的地方太多了:必须为每个编译器在编译器中记录它选项,所以它必须是一个搜索的地方
预处理器不是编译器,预处理器只知道文本。它接收文本,输出文本,截取以# 开头的内容并执行它的操作。就像nroff 一样。
因此预处理器输出没有语言格式:它只是文本
在 Windows 上使用 gcc 10.2 的示例
搜索gcc preprocessor output option会在第一页得到这个
无论如何引用gcc docs
如果您使用 -E 选项,则除了预处理之外什么都不做。其中一些选项只有与 -E 一起使用才有意义,因为它们会导致预处理器输出不适合实际编译。
文件 pp1.h
// pp1.h
int x = 300;
// end of pp1.h
文件 pp2.h
// pp2.h
return
// end of pp2.h
文件 pp.c
#include "pp1.h"
int main(void)
{
#include "pp2.h"
x;
}
// end of pp.c
gcc -E pp.c 的输出
# 1 "pp.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "pp.c"
# 1 "pp1.h" 1
int x = 300;
# 2 "pp.c" 2
int main(void)
{
# 1 "pp2.h" 1
return
# 6 "pp.c" 2
x;
}
由于 -E 选项,代码没有被编译,但它肯定是有效的 C,因为这是我们一直在做的事情:使用一些 #define,一些 #include 并编译我们的代码。
我们可以将它再次通过管道传递给 gcc,并像往常一样使用生成程序
gcc -E pp.c | gcc -o pp.exe -xc -
然后像往常一样运行程序:
C:\src>pp
C:\src>echo %ERRORLEVEL%
300
对通用文本使用预处理器
当然,用处不大,但只是作为案例的 5 分钟说明,这里的 t1.txt 是城市列表:
t1.txt
#include "t1.h"
Microsoft Corporate Offices Addresses(where found)
Austin
Costa Mesa
Houston
Nashville
Memphis
Mountain View
t1.h
标题有城市和地址列表
#define Nashville \
Nashville: Corporate Sales Office \
8 City Boulevard, Suite 403 \
Nashville, TN, USA \
37209
#define Memphis \
Memphis: Corporate Sales Office \
6465 N. Quail Hollow Road, Suite 200 \
Memphis, TN, USA \
38120
#define Houston \
Houston: Corporate Sales Office \
750 Town and Country Boulevard, St. 1000 \
Houston, TX, USA \
77024
// end of t1.h
预处理器输出
这个命令
gcc -E -x c t1.txt | grep -v "^#"
在 gcc 10.2 下显示
Microsoft Corporate Offices Addresses(where found)
Austin
Costa Mesa
Houston: Corporate Sales Office 750 Town and Country Boulevard, St. 1000 Houston, TX, USA 77024
Nashville: Corporate Sales Office 8 City Boulevard, Suite 403 Nashville, TN, USA 37209
Memphis: Corporate Sales Office 6465 N. Quail Hollow Road, Suite 200 Memphis, TN, USA 38120
Mountain View
输出显而易见:当在列表中找到办公室地址时,将其附加到城市。
只是一个玩具。预处理器不懂编程语言。