2013-09-30 80 views
12

我正在爲一個家庭作業C文件,我想這可能有助於年級的學生,如果我做了我的答案,可見像這樣:C中多行註釋警告的含義是什麼?

//**********|ANSWER|************\\ 
//blah blah blah, answering the 
//questions, etc etc 

,並用gcc編譯時發現,在那些反斜槓字符第一行的結尾似乎引發了「多行評論」警告。當我刪除它們時,警告消失了。所以我的問題是雙重的:

a)反斜槓字符的存在如何使其成爲「多行註釋」,以及b)爲什麼多行註釋成爲問題?

+2

跟蹤\的數量是無關緊要的。最後一個是「逃避換行」(因此繼續[現在多線]評論) - 這發生在CPP級別。從「blah blah」前面刪除'//'(留在尾部的兩個或兩個),程序仍然應該編譯,同樣的警告和以前一樣。 – user2246674

+0

啊,有道理。謝謝。 – superexcellent12

回答

17

C(自1999年標準以來)有兩種形式的評論。

舊樣式註釋由/*引入,終止於*/,並且可以跨越一部分線條,一條完整線條或多條線條。

C++風格的註釋由//引入,並在行尾結束。

但是在行末尾的反斜槓導致該行爲拼接到下一行。因此,您可以合法地引入//的評論,在該行的末尾添加反斜槓,並導致該評論跨越多個物理行(但只有一個邏輯行)。

這就是你做你的第一行是什麼:

//**********|ANSWER|************\\ 

只需使用比反斜槓其他的東西在該行的結尾,例如:

//**********|ANSWER|************// 

但即使是潛在的誤導,因爲它幾乎看起來像一箇舊式/* .. */評論。你可能會考慮一些稍微簡單一些:

/////////// |ANSWER| //////////// 

或:

/**********|ANSWER|************/ 
0

這會評論它下面的線爲好。如果你想這樣做,所有在毫無預警一行嘗試

/* // Bla \\ */ 
5

編譯器只是告訴你,你有可能在不經意間被註釋掉的代碼的下一行通過結束之前的評論符合\,這是C中的行連續字符。這會導致第二行與第一行連接。這反過來使得//評論實際上註釋掉了這兩個原始行。在你的情況下,這不是一個問題,因爲下一行也是一個評論。

但是,如果下一行不打算作爲註釋,那麼你可能已經結束了「奇怪的行爲」:編譯器忽略第二行沒有明顯的原因。這種情況常常因爲一些語法高亮的代碼編輯器沒有檢測到這種情況並且無法將下一行突出顯示爲評論而變得複雜。

通常,由於這個特定的原因,濫用\字符作爲代碼級別不是一個好主意。只有在你真的需要的時候才使用它,也就是說,如果你真的想把幾條線縫成一條線的話。

2

一)究竟怎樣的反斜槓字符的存在使之成爲「多行註釋」,並

反斜線作爲行中的最後一個字符意味着編譯器應忽略反斜槓換行符 - 它告訴編譯器在它應該檢查註釋之前執行此操作。所以說,刪除註釋之前應該有效地看着

//**********|ANSWER|************\//blah blah blah, answering the 
//questions, etc etc 

現在看到//開始和忽略該行的其餘

b)爲何會多行註釋是無論如何都有問題?

在你的例子中,不是因爲第二行是註釋,但是如果你在第二行寫了一些有用的東西呢?

既然你問了一個問題「a」,你很可能沒有意識到編譯器的行爲是這樣的,如果你沒有意識到你已經註釋掉了一行代碼,那麼它很好編譯器警告你。

另一個原因是,即使知道這是通常編輯器不會明顯地顯示空白,因此很容易錯過反斜線可能或不可能是行上的最後一個字符。例如:

int i = 42; 

// backslash+space: \ 
i++ 
// backslash and no space: \ 
i-- 
printf("%d\n", i); 

會導致43因爲i--被註釋掉,但i++不是(因爲反斜線不就行了最後一個字符,但空間)。

1

沒人來問,不過這是在谷歌上的答案,所以

阻滯,這個特定的警告可能會與-Wno-comment選項來完成。

相關問題