2010-12-10 4 views
3

Я пытался выяснить что-то, когда я написал это по ошибкеprintf ("string1" "string2") - это действительный C?

printf("string1""string2"); 

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

т.е.
string1string2 

Является ли это действительный C?

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

+1

Разве это не замечательно? :) – 2010-12-10 12:52:57

ответ

7

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

6.4.5/4:

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

2

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

1

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

"very long string " 
"that continues over here" 

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

3

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

#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" 
); 
+0

Ницца. Да, я тоже это использовал. – 2010-12-10 13:10:02