2016-11-26 20 views
0

我在編譯和VS2015 Xcode中使用gcc我的遊戲引擎代碼
我用很多編譯我的代碼,只有GCC顯示警告:。「警告:缺少終端」字符」,在假條件

warning : missing terminating " character 

代碼就像下面:

#if 1 
    ... 
#else 
    asm __volatile__(" 
    some assembly code 
    ... 
    ":::); 
#endif 

我知道最近的gcc不接受字符串中的新行,但我不知道爲什麼GCC預處理器噴出的假模塊警告
我知道我的WR。內聯彙編的風格舊,但它們處於錯誤的條件塊。我不想碰他們,因爲有這麼多。
如何在假條件塊中避免此警告,除了禁止所有警告?

編輯:
我用Armcc,VC++(2005,2008,2012,2013,2015)和clang編譯了我的代碼。他們沒有表現出這種警告,只有海灣合作委員會。
如果警告是針對TRUE條件塊中的代碼,我會修復它們。但是這個警告是針對不應該被評估的FALSE條件塊。

+0

你見過這個[答](http://stackoverflow.com/a/10205777/5588347)? –

+2

可能重複[有關GCC內聯彙編的奇怪錯誤消息](http://stackoverflow.com/questions/10205691/strange-error-message-about-gcc-inline-assembly) – Carpetsmoker

+0

@Carpetsmoker:問題不在於「缺少終止字符「錯誤本身(OP非常清楚它缺少),而是關於爲什麼它發生在看似*禁用的*代碼段中。 – AnT

回答

0

C預處理器是字符串意義。每種語言的語法,字符串文字是預處理標記

preprocessing-token: 
    header-name 
    identifier 
    pp-number 
    character-constant 
    string-literal 
    punctuator 
    each non-white-space character that cannot be one of the above 

這當然是完全預期的一個,因爲否則預處理器將無法從"MACRO_NAME"(後者告訴MACRO_NAME只是一個字符串)。

由於這個原因,你的字符串文本應該被正確地格式化以用於預處理目的。我認爲GCC看到第一個"並開始將該序列解釋爲字符串文字,但隨後放棄嘗試(由於缺少終止")並將其歸入通用的「不能是上述之一」類別,並附帶一個警告,

您似乎認爲條件包含在更高的預處理級別上工作比識別字符串文本這樣的標記。這個假設是不正確的。預處理器別無選擇,只能解析代碼的「禁用」區段。

+0

感謝您的詳細解釋。 我的問題是爲什麼只有gcc顯示警告而其他人不顯示。 我一直試圖儘可能多地刪除警告,並且想要刪除此警告。但如果我不能,我會保持警告狀態。 – yhorimoto

+0

@yhorimoto:警告是非規範性的。 GCC認爲它值得警告,而Clang(另一個例子)沒有。 – AnT