2012-02-21 14 views
9

İlk defa clang ile oluşturduğum bazı (eski) kodlarım var.Clang ile trigraphların devre dışı bırakılması için bir anahtar var mı?

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

Clang aşağıdaki uyarısı (-Werror ile hata) veren: Kod gibi bir şey olduğunu Açıkça ??> bir TriGraph ™ mod seçimini olarak tasarlanmamıştır

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

, bu yüzden (tamamen üç karakterli devre dışı bırakmak istediğiniz Kaynak bilerek onları herhangi bir yerde kullanmaz.

Ben -no-trigraphs denedi ama bu gerçekten bir seçenek değil:

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

Ben -Wno-trigraphs ile uyarı üç karakterli kapatabilirsiniz ama sesli üç harf dönüşüm aslında hiç gerçekleşecek istemiyoruz.

NOT: Trigraflar, -std=c89 kullanımının istenmeyen bir yan etkisi olarak etkinleştirildi.

+2

Ouch! GCC, '-trigraphs' ile ellerini ateşe vermedikçe, sıkı uyum modunda bile trigrafları görmezden gelerek mantıklı bir politikaya sahiptir. Çölden kaçma zamanı? Ya da eşdeğer. –

+3

Aslında GCC'nin sıkı uyumluluk modları ('-std = c89',' -std = c99' vb) trigraph dönüşümünü açar. – zwol

+1

Ve eğer birisi WTH'nin bir trigraf olduğunu merak ediyorsa. [İşte midilli] (http://stackoverflow.com/questions/7825055/what-does-the-c-operator-do) ... – Mysticial

cevap

6

gnu * modunu kullanarak deneyin - "gnu * modlarında kapalı olmasının üç karakterli varsayılan, onlar -trigraphs seçeneği ile etkinleştirilebilir." (diğer farklılıklar ve komut satırı anahtarı için http://clang.llvm.org/docs/UsersManual.html#c_modes'a bakın)

+0

Ah, o kadardı! '-std = c89 'kullanıyordum, ama' -std = gnu89' ile 'hata: trigraph göz ardı ediliyor [-Werror, -Wtrigraphs]' '' -Wo-trigraphs' ile devre dışı bırakabilirim. –

+2

Ayrıca gnu uzantılarını etkinleştirmeden trigrafları devre dışı bırakmanın bir yolu var mı? – bames53

4

Trigrafları devre dışı bırakmanın bariz bir yolunu göremedim (uyarıların tetiklenmesi yerine). Muhtemelen bu kodu gidermenin en kolay yolu onu değiştirmektir:

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

Makul bir seçenek gibi görünüyor. Milyonlarca satırlık kaynak, '??> sadece dört kez oluşur. –

+0

'" ... ??? \?> "' Ayrıca çalışmalıdır. Ters eğik çizgiyi, işaretin iki soru işareti arasına yerleştirin. – zwol

+0

Trigraflar herhangi bir yerde görünebileceğinden, herhangi bir trigrafı güvenli bir sekansa dönüştürmek için belki de "sed" s/?? \ ([- <>() \/= # '] \) /? \\? \ 1/g "' . Öte yandan, bir dizgenin dışında, belki de en iyi standart forma dönüştürülecek mi? Neyin en iyi olduğuna karar vermek biraz zorlaşıyor. (Sadece bir kez, benim 'sed' betiği desen etrafında çift tırnak kullanır, çünkü desende tek bir alıntı vardır.) –

İlgili konular