a.txt
a text
#include "b.txt"
b.txt
b text
如果我们使用
cpp -P a.txt
预处理上述文件,我们会在控制台中得到以下输出:
a text
b text
但是,如果我们尝试使用
clang -P a.txt
进行预处理,我们会收到以下错误:
ld: unknown file type in '/Users/myUser/a.txt'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
clang
和cpp
的预处理行为有什么区别?特别是,它们在 .txt 文件的用例中有何区别? 看似相关的线程,以及指定给MacOS的另一个。
cpp
是一个预处理器。 clang
是一个编译器,可以在编译其输入文件之前调用预处理器。您不能仅将它们与相同的命令行选项一起使用。
clang
与gcc
类似。两者都采用 -E
选项来仅调用预处理阶段——并且都假设名称以 .txt
结尾的输入文件适用于链接器。
以下内容适用于我的系统。
-
参数告诉命令从 stdin 读取,因此它看不到 .txt
后缀。
$ cat a.txt
a text
#include "b.txt"
$ cat b.txt
b text
$ gcc -P -E - < a.txt
a text
b text
$ clang -P -E - < a.txt
a text
b text
$
clang
使用的预处理器添加了一个额外的空行。由于输出是要编译的,通常是 C 或 C++,所以这通常并不重要。
C 预处理器并不是真正的通用文本处理器。例如,它将输入拆分为预处理标记,因此单独的撇号可能会导致错误,因为预处理器将其视为不完整的字符常量。