2016-05-12 57 views
2

如果我嘗試編譯文件(error_c11.cpp),其內容是:警告與#ERROR預處理指令有撇號

#if 0 
#error This shouldn't be a problem 
#endif 

用命令行:

gcc error_c11.cpp 

我得到以下警告(然後關於主其他一些鏈接錯誤):

error_c11.cpp:2:20: warning: missing terminating ' character 
#error This shouldn't be a problem 

相反,編譯具有相同或Visual Studio不會給出任何警告。這是gcc(使用v4.9.3)中的bug,還是'中的字符不允許在#error預處理器指令中使用,其他編譯器是否更寬容?

+1

根據語法,這是#誤差* pp-tokens newline *,其中* pp-tokens *是一個或多個*預處理 - 標記*,其中包括*字符文字*。我可以看到這是無效的語法。 – chris

+1

嗯,這實際上是一個_warning_。似乎即使c預處理器傾向於靜態代碼分析的AI功能。 –

+0

嘗試將您的消息放在雙引號中。 –

回答

3

#error指令的語​​法是:

#errorPP-令牌選擇新行

PP-令牌是一個預處理器令牌。只有當它是字符常量(或字符串文字,或可能是標題名稱)的一部分時,撇號纔會出現在預處理標記中。

#error後面的標記不必是句法上的正確,但它們必須是有效的標記。

一種解決方法:

#if 0 
#error "This shouldn't be a problem" 
#endif 

你甚至可以寫:

#if 0 
#error This shouldn't be a problem, m'kay? 
#endif 

在這種情況下,'t be a problem, m'被視爲一個多字符常量,這是廢話,但在這方面的法律。

(A題外話:嘗試應用C預處理阿達碼遇到了類似的問題,因爲阿達使用單個撇號以引入一個屬性或合格表達。)