'cpp' vs. “clang”预处理行为

问题描述 投票:0回答:1

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的另一个

gcc clang c-preprocessor preprocessor
1个回答
0
投票

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 预处理器并不是真正的通用文本处理器。例如,它将输入拆分为预处理标记,因此单独的撇号可能会导致错误,因为预处理器将其视为不完整的字符常量。

© www.soinside.com 2019 - 2024. All rights reserved.