2014-02-20 26 views
2

爲什麼當ONOFF模式嚴格遵守ANSI C程序會產生不同的結果?遵守嚴格的有關的原因,大多數現代工業的編譯器默認了自己的語言的一些擴展,以及一些默認的寫作是C99不同的結果與開/關模式嚴格符合ANSI C

#include <stdio.h> 
#include <string.h> 
int main (void) 
{ 
    int len; 
    len = strlen ("??="); 
    printf ("len=%d\n", len); 
    return 0; 
} 

下面是結果。在提交編譯選項-w抑制警告這兩種情況下:

$ gcc t.c -w 
$ ./a.out 
len=3 

$ gcc t.c -ansi -w 
$ ./a.out 
len=1 
+2

抑制警告是不是一個好主意:)存在無風不起浪。 (對於'int main(void)',仍然爲+1) –

+1

我很好奇 - 你是否偶然發生了使用'「?? =」'作爲測試字符串,你在更大的程序中遇到奇怪並縮小它到這個,或者你已經知道'「?? =」'是一個三元組,但仍然不確定不同的結果? –

+1

@邁克爾伯爾我故意使用三字母。但我最近遇到他們,所以還沒有弄清楚細節 – dima

回答

2

當不是在ANSI模式gcc不轉換trigrpah ??=長度3)至#長度1),其解釋了長度區別。

如果你沒有抑制警告gcc會警告說,它忽略了非ANSI模式(see it live)的trigraph

警告:三元符?? =忽略,使用-trigraphs啓用[ -Wtrigraphs]

你可以閱讀更多有關gcc文檔的Options Controlling C Dialect部分方言的選項。它說-ansi

[...]它也使不受歡迎的和很少使用的ISO trigraph功能。 [...]

三字母序列在draft C99 standard部覆蓋5.2.1.1三字符序列,其表示:

任何其他處理髮生之前,三個下列 序列之一的每次出現字符(稱爲三字符序列12))被替換爲相應的單個字符。

和以下序列包括:

??= # 
+0

@downvoter謹慎解釋你爲什麼低估了這個問題和我的答案,但似乎覺得其他答案值得注意? –

2

"??="是三字符。如果您無法在您的終端中輸入您想要輸入的內容,那麼這是一個非常古老的想法來轉義源代碼。

"??="是實際"#"