簡體   English   中英

為什么使用Visual Studio而不是GCC進行編譯時不會出現錯誤?

[英]Why does this compile without an error with Visual Studio and not GCC?

您知道為什么在Visual Studio(2012)而不是GCC 4.7.2中不會出現錯誤地進行編譯嗎?

我正在棘手的源文件上運行一些編譯器測試。 根據此處接受的答案,GCC不應出錯(錯誤:/令牌之前的預期表達式):刪除緊跟換行符的任何反斜杠字符()以及換行符。 因此,這等效於行拼接,應預處理為單行。

#include                                        \
                                                \
    "my_header_\
file_example.h" /* this is a long trailing\
                comment */

如果實際上在\\之后緊跟着行尾,則源代碼正確,並且應由兼容的編譯器接受。 C99語言的草案在5.1.1.2轉換階段中說:

§2: 刪除緊跟換行符的每個反斜杠字符( \\ )實例,將物理源代碼行拼接成邏輯源代碼行。 只有任何物理源代碼行上的最后一個反斜杠才有資格成為此類接頭的一部分。 不為空的源文件應以換行符結尾,在進行任何此類拼接之前,不得在其后立即加上反斜杠字符。

這實際上發生在預處理器執行任何#include 之前的階段2中因此應根據標准接受它:

§4: 執行預處理指令,擴展宏調用,並執行_Pragma一元運算符表達式。 如果通過標記串聯(6.10.3.3)產生了與通用字符名的語法匹配的字符序列,則該行為未定義。 #include預處理指令使命名的標頭或源文件從階段1到階段4進行遞歸處理。

但是,如果\\與行尾之間有空格,則§2的操作將不會發生,並且會出現錯誤。

在宏中忽略反斜杠/換行符組合是正確的(宏繼續)。 但是,這發生在字符串中。 反斜杠后面不跟n或其他定義的轉義字母,而是跟0x0d0x0a ,然后將其按字面意義放入字符串中。 因此,它嘗試打開的文件類似於my_header_0x0dfile_example.h

順便說一句,很有趣地知道它帶來的錯誤。 正如我在上面所懷疑的那樣,它抱怨找不到文件,而不是“字符串文字中的非法'\\'”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM