2012-05-09 15 views
22

Jaka jest maksymalna długość linii źródłowej wszystkie kompilatory są wymagane do zaakceptowania do? Czy zmieniło się w C++ 11? Jeśli tak, jaka była stara wartość?Ograniczenie długości linii źródłowej

Zadaję to pytanie, ponieważ robię ciężki preprocesor voodoo (niestety szablony go nie wycinają), a robi to bardzo szybko. Chcę pozostać po bezpiecznej stronie, więc nie będę musiał się martwić o możliwość kompilatora X na platformie Y odrzucającego mój kod z powodu zbyt długich linii.

+0

Chciałbym raczej sprawdzić, czy istnieje sposób uniknięcia preprocessor voodoo. Jest to bardziej prawdopodobne niż zależne od szczegółów implementacji. –

+0

Nie sądzę, że trudno byłoby kompilatorowi C++ zaakceptować nieskończoną długość linii, ale nigdy go nie napisałem. –

+0

@stefanbachert: Nie mogę tego uniknąć, to jest problem. Chodzi również o to, aby wiedzieć, gdzie zaczyna się ziemia określona na etapie wdrażania, aby uniknąć błądzenia w niej. – Fanael

Odpowiedz

30

C++ 2003, Załącznik B (informacyjny) ilości wdrożeniowe (przepraszam, nie mam C++ 2011 poręczny)

2) Limity mogą ograniczać ilości, które obejmują te opisane poniżej lub innych. Numer w nawiasie numer jeden po każdej ilości jest zalecany jako minimalny dla tej ilości. Jednak te ilości są tylko wytycznymi i nie określają zgodności.

...

  • znaków w jednej linii kodu logicznego [65 536].

Nie pytałem o nich, ale mogą one być przydatne również:

  • poziomy zagnieżdżenia wyrażeń w nawiasach w pełnej ekspresji [256].
  • Identyfikatory makr jednocześnie zdefiniowane w jednej jednostce tłumaczeniowej [65 536].
  • Argumenty w jednym wywołaniu makra [256].
  • Liczba znaków w wewnętrznym identyfikatorze lub nazwie makra [1 024].
  • Identyfikatory makr jednocześnie zdefiniowane w jednej jednostce tłumaczeniowej [65 536].
  • Parametry w jednej definicji makra [256].


Postscript: Warto zauważyć, co "jedna linia źródło logiczne" jest. Linia logiczne źródło jest to, co masz po:

  • znaków pliku źródłowego fizyczne są przypisane do podstawowego źródła charakterze ustawić
  • Trigraph sekwencje (2.3) są zastępowane przez odpowiednie reprezentacje wewnętrzne pojedynczych znaków
  • Każde wystąpienie znaku nowej linii i bezpośrednio poprzedzający backslash charakter usuniętych

linię w źródle logiczne jest to, co masz przed:

  • plik źródłowy rozkłada się tokenów preprocesora
  • Preprocessing d irectives są wykonywane, a inwokacje makr są rozszerzane.

[cytaty z C++ 2003, 2,1 Fazy Translation]

Tak więc, jeśli problemem PO jest, że makra rozwijają się poza rozsądną długość linii, moja odpowiedź jest bez znaczenia. Jeśli obawa PO polega na tym, że jego kod źródłowy (po zaadaptowaniu się do \, \n) może być zbyt długi, moja odpowiedź jest ważna.

+7

Aby potwierdzić, jest to takie samo w C++ 11. –

+3

+1: Jest to samne w C++ 11: "- Znaki w jednej logicznej linii źródłowej [65 536]." Załącznik B.2: –

+0

Wystarczy powiedzieć: Kompilator może odrzucić (lub zrobić cokolwiek innego) plik zawierający zwykły kod "Witaj świecie" z powodu zbyt długich linii. To jest niezdefiniowane zachowanie. Zastanawiam się, dlaczego nie masz jasnego oświadczenia w swojej odpowiedzi na temat konsekwencji naruszenia limitu "długich linii" ... –

Powiązane problemy