printf ("string1" "string2") это допустимый C? - PullRequest
3 голосов
/ 10 декабря 2010

Я пытался что-то выяснить, когда написал это по ошибке

printf("string1""string2");

К моему удивлению, он скомпилировал и выдал каскадную строку, т.е.

string1string2

Это действительный C?

Я использую GCC version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)

Ответы [ 4 ]

7 голосов
/ 10 декабря 2010

Да, это так.Последовательные строковые литералы объединяются на ранних этапах синтаксического анализа C.

6.4.5 / 4:

На этапе 6 трансляции последовательности многобайтовых символов определяются любой последовательностью соседнего символаширокие строковые литеральные токены объединяются в одну многобайтовую последовательность символов.Если какой-либо из токенов является токеном с широкими строковыми литералами, результирующая многобайтовая последовательность символов обрабатывается как литерал с широкими строковыми литералами;в противном случае он обрабатывается как строковый литерал.

3 голосов
/ 10 декабря 2010

Да, и это может быть очень полезно объединить строковые константы во время компиляции.

#define VERSION "1.0"
#define COMPANY "Trivial Software"

printf("hello world: v. " VERSION " copyright (c) " COMPANY);

или

puts(
  "blah blah blah\n"
  "blah blah blah\n"
  "blah blah blah\n"
  "blah blah blah\n"
);
2 голосов
/ 10 декабря 2010

Да, он действителен и был частью языка Си очень долгое время (если не с самого начала).Конкатенация выполняется во время компиляции.

1 голос
/ 10 декабря 2010

Как сказал другой, да, это действительно. Я только хотел добавить, что действительно полезно вводить длинные строки, которые заполняют несколько строк. Вам не нужно связываться с \, чтобы указать, что строка продолжается, и вы не хотите добавлять возврат каретки, так что вы просто пишете:

"very long string "
"that continues over here"

(обратите внимание на пробелы в конце каждой строки, это распространенная ошибка. В этом случае "строка" и "это" будут объединены.)

...