AFAIK,这个问题同样适用于C和 C++
C标准(草案 C99 标准中的 5.1.1.2)中指定的“翻译阶段”的第 6 步规定必须将相邻的字符串文字连接成单个文字。IE
printf("helloworld.c" ": %d: Hello "
"world\n", 10);
等效于(语法上):
printf("helloworld.c: %d: Hello world\n", 10);
但是,该标准似乎没有指定编译器的哪个部分必须处理这个问题——它应该是预处理器 ( cpp
) 还是编译器本身。一些在线研究告诉我,此功能通常预计由预处理器(源 #1、源 #2等等)执行,这是有道理的。
但是,cpp
在 Linux 中运行表明cpp
并没有这样做:
eliben@eliben-desktop:~/test$ cat cpptest.c
int a = 5;
"string 1" "string 2"
"string 3"
eliben@eliben-desktop:~/test$ cpp cpptest.c
# 1 "cpptest.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "cpptest.c"
int a = 5;
"string 1" "string 2"
"string 3"
所以,我的问题是:语言的这个特性应该在哪里处理,在预处理器还是编译器本身?
也许没有一个好的答案。基于经验、已知编译器和一般良好工程实践的启发式答案将不胜感激。
PS如果你想知道我为什么关心这个......我试图弄清楚我的基于Python的C解析器是否应该处理字符串文字连接(目前它不这样做),或者cpp
让它它假设在它之前运行。