Где начинается и заканчивается строковый литерал?

Стандарт C99 говорит, что предел реализации для символов строкового литерала составляет 4095 (?). Но где именно заканчивается и начинается литерал?

printf(
    "First part"
    "second part!\r\n"
    );

Будет ли это однострочный литерал? Или это 2 строковых литерала?


person dhein    schedule 27.10.2013    source источник


Ответы (1)


N1256 5.2.4.1 говорит:

  • 4095 символов в строковом литерале символов или широком строковом литерале (после конкатенации)

«После объединения» относится к объединению соседних строковых литералов, которое происходит в фазе перевода 6 (5.1.1.2).

Таким образом, для целей ограничения в 4095 символов это:

"First part"
"second part!\r\n"

является однострочным литералом.

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

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

Ограничение такое же в C11. В C90 это было 509 символов.

Между прочим, вряд ли есть веская причина печатать "\r\n" в вызове printf. stdout — это текстовый поток, что означает, что символ новой строки '\n' будет преобразован во все, что ОС использует в качестве индикатора конца строки.

(N1256 — это черновик после C99, состоящий из официального стандарта C99 с включенными в него тремя техническими исправлениями. N1570 — последний черновик до C11, и он почти идентичен выпущенному стандарту C11. Официальные стандарты не находятся в свободном доступе. .)

person Keith Thompson    schedule 27.10.2013