在C和C++中实现字符串文字串联

Eli*_*sky 7 c c++ string-literals c-preprocessor

AFAIK,这个问题同样适用于C和C++

C标准中规定的"翻译阶段"的第6步(C99标准草案中的5.1.1.2)规定,必须将相邻的字符串文字连接成单个文字.

printf("helloworld.c" ": %d: Hello "
       "world\n", 10);
Run Code Online (Sandbox Code Playgroud)

等同于(语法上):

printf("helloworld.c: %d: Hello world\n", 10);
Run Code Online (Sandbox Code Playgroud)

但是,标准似乎没有指定编译器的哪个部分必须处理它 - 它应该是预处理器(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"
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:在预处理器或编译器本身中,应该在何处处理该语言的这一特性?

也许没有一个好的答案.基于经验,已知编译器和一般良好工程实践的启发式答案将不胜感激.


PS如果你想知道为什么我关心这个......我正在试图弄清楚我的基于Python的C语法分析器是否应该处理字符串文字连接(目前它没有这样做),或者将它留给cpp哪个它假设在它之前运行.

Jer*_*fin 8

该标准没有指定预处理器与编译器,它只是指定了您已经注意到的翻译阶段.传统上,阶段1到阶段4在预处理器中,编译器中的阶段5到阶段7,以及阶段8到链接器 - 但标准不需要这些阶段.