2012-05-09 5 views
22

Какова максимальная длина исходной строки все составители обязательны для заполнения принять? Это изменилось в C++ 11? Если да, то какова была старая ценность?Ограничение длины строки источника

Я задаю этот вопрос, потому что я делаю тяжелый препроцессор voodoo (к сожалению, шаблоны не будут его обрезать), и это имеет тенденцию очень быстро делать линии. Я хочу остаться в безопасности, поэтому мне не придется беспокоиться о возможности компилятора X на платформе Y, отклоняя мой код из-за слишком длинных строк.

+0

Я предпочел бы проверить, есть ли способ избежать препроцессора вуду. Это более вероятно, чем зависеть от детали реализации. –

+0

Я бы не подумал, что было бы сложно заставить компилятор C++ принимать бесконечные длины строк, но тогда я его никогда не писал. –

+0

@stefanbachert: Я не могу этого избежать, вот в чем проблема. Кроме того, суть вопроса заключается в том, чтобы знать, где начинается определенная реализация земля, чтобы я мог избежать блуждания по ней. – Fanael

ответ

30

C++ 2003, Приложение Б (справочное) величины реализации (извините, не C++ 2011 под рукой)

2) Ограничения могут ограничить объемы, которые включают те, которые описаны ниже или других. Номер в скобках , следующий за каждым количеством, рекомендуется как минимум для этого количества. Однако эти величины соответствуют только рекомендациям и не определяют соответствия.

...

  • символов в одной логической исходной линии [65 536].

Вы не спрашивали об этом, но они могут быть полезны также:

  • Верстка уровни выражения в скобках в полное выражение [256].
  • Идентификаторы макросов, определенные одновременно одной единицей перевода [65 536].
  • Аргументы в одном вызове макроса [256].
  • Число символов во внутреннем идентификаторе или имени макроса [1 024].
  • Идентификаторы макросов, определенные одновременно одной единицей перевода [65 536].
  • Параметры в одном определении макроса [256].


Postscript: Стоит отметить, что "один логический источник линия". логический источник линии является то, что у вас есть после:

  • Физические символы исходного файла преобразуются в основной источник набор символов
  • триграф последовательности (2.3) заменены соответствующими односимвольные внутренние представления
  • Каждый экземпляр символа новой строки и непосредственно предшествующий обратной косой черты удален

Логический источник строки является то, что у вас есть перед тем:

  • исходный файл разбивается на предобработки лексем
  • Препроцессирование д выполняются и запускаются макроопределения.

[цитаты из C++ 2003, 2.1 Этапы перевода]

Итак, если забота OP является то, что макросы расширяться за пределы разумной длины линии, мой ответ не имеет никакого значения. Если озабоченность OP заключается в том, что его исходный код (после работы с \, \n) может быть слишком длинным, мой ответ стоит.

+7

Просто для подтверждения, это то же самое в C++ 11. –

+3

+1: Это сама в C++ 11: "- Символы в одной логической исходной строке [65 536]." Приложение B.2 –

+0

Просто сказать: компилятору разрешено отклонять (или делать что-либо еще) файл, содержащий обычный код «hello world» из-за слишком длинных строк. Тогда это неопределенное поведение. Интересно, почему у вас нет четкого заявления в вашем ответе о последствиях нарушения предела «длинных строк» ​​... –

Смежные вопросы