2012-02-21 9 views
9

Mam (starszy) kod, który buduję z klangiem po raz pierwszy. Kod jest coś takiego:Czy istnieje przełącznik do wyłączania trigrafów z klang?

sprintf(buf, "%s <%s ????>", p1, p2); 

Clang daje następujące ostrzeżenie (błąd z -Werror):

test.c:6:33: error: trigraph converted to '}' character [-Werror,-Wtrigraphs] 
    sprintf(buf, "%s <%s ????>", p1, p2); 
         ^

Wyraźnie ??> nie jest pomyślana jako trigraph, więc chcę, aby całkowicie wyłączyć trójznaków (the źródło nie używa ich celowo w dowolnym miejscu).

Próbowałem -no-trigraphs ale to naprawdę nie jest opcja:

clang: warning: argument unused during compilation: '-no-trigraphs' 

mogę wyłączyć trójznaków ostrzegawcze z -Wno-trigraphs ale nie chcę konwersja trigraph faktycznie nastąpić w ogóle.

UWAGA: Trigraphs włączono jako niezamierzony efekt uboczny użycia -std=c89.

+2

Ouch! GCC ma rozsądną politykę ignorowania trigrafów, nawet w trybie ścisłej zgodności, chyba że trzymasz ręce w ogniu za pomocą '-trigraphs'. Czas się wyrwać "sed"? Lub odpowiednik. –

+3

W rzeczywistości ścisłe tryby zgodności GCC ('-std = c89',' -std = c99', etc) włączają konwersję trigraf. – zwol

+1

A jeśli ktoś się zastanawia, WTH to trigraf. [Tutaj jest kucyk] (http://stackoverflow.com/questions/7825055/what-does-the-c-operator-do) ... – Mysticial

Odpowiedz

6

Spróbuj użyć trybu gnu * - „domyślny trójznaków do bycia off w gnu * trybach, mogą być włączone przez opcję -trigraphs”. (patrz http://clang.llvm.org/docs/UsersManual.html#c_modes dla innych różnic i przełącznika wiersza poleceń)

+0

Ach, to było to! Używałem '-std = c89', ale z' -std = gnu89' otrzymuję komunikat 'error: trigraph ignored [-Werror, -Wtrigraphs]' który mogę wyłączyć za pomocą '-Wno-trigraphs'. –

+2

Czy istnieje sposób na wyłączenie trigrafów bez włączania rozszerzeń gnu? – bames53

4

Nie widziałem oczywistego sposobu wyłączenia trigrafów (zamiast ostrzeżenia trigrafów). Prawdopodobnie najprostszym sposobem, aby naprawić ten kod jest zmienić go na adres:

sprintf(buf, "%s <%s ????"">", p1, p2); 
+0

To wydaje się rozsądną opcją. Z milionów linii źródłowych '??>' występuje tylko cztery razy. –

+0

'' ... ??? \?> "' Powinno również działać. Umieść lewy ukośnik między dwoma znakami zapytania w samym trigrum. – zwol

+0

Ponieważ trigrafy mogą się pojawiać w dowolnym miejscu, może "sed" s/?? \ ([- <>() \/= # '] \) /? \\? \ 1/g "' przekształca dowolną trografię w bezpieczną sekwencję . Z drugiej strony, poza sznurkiem, może najlepiej byłoby, gdyby trigraf został przekształcony w jego standardową formę? Trochę trudno jest zdecydować, co jest najlepsze. (Tylko raz, mój skrypt 'sed' używa podwójnych cudzysłowów wokół wzorca, ponieważ istnieje jeden cudzysłów we wzorze). –

Powiązane problemy