Насколько я знаю, этот вопрос в равной степени относится к C и C++.
Шаг 6 «этапов перевода», указанных в стандарте C (5.1.1.2 в проекте стандарта C99), гласит, что смежные строковые литералы должны быть объединены в один литерал. Т.е.
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"
Итак, мой вопрос: где должна обрабатываться эта особенность языка, в препроцессоре или в самом компиляторе?
Возможно, нет единственного хорошего ответа. Будут оценены эвристические ответы, основанные на опыте, известных компиляторах и общей хорошей инженерной практике.
P.S. Если вам интересно, почему меня это волнует... Я пытаюсь выяснить, действительно ли мой Python Парсер на основе C должен обрабатывать конкатенацию строковых литералов (чего он не делает в данный момент) или оставить его для cpp
, который, как он предполагает, выполняется перед ним.
cpp
, оно неотличимо от того, что находится в компиляторе :-) - person Eli Bendersky   schedule 01.07.2010