《c陷阱和缺陷》筆記–C編譯器的注釋嵌套

來源:互聯網
上載者:User

本文轉載於:http://www.cnblogs.com/liuxiaoming/archive/2012/08/13/2636831.html

某些C編譯器允許嵌套注釋。請寫一個測試程式,要求:無論是對允許嵌套注釋的編譯器,還是對不允許嵌套注釋的編譯器,該程式都能正常通過編譯,但是這兩種情況下程式執行的結果卻不同。

首先,要說明的是C90隻有一種注釋風格,就是使用“/*”和“*/”,是沒有//注釋符號的。在預先處理階段,C前置處理器會剔除所有出現在“/*”和“*/”之間的內容(包括這對記號本身),所以在接下來傳送到C編譯器的代碼檔案裡是不會出現任何注釋內容的。

下面說明什麼是嵌套注釋:
什麼是注釋呢?注釋就是寫什麼東西都無所謂,反正編譯器不會看到這些東西。很不幸,C前置處理器一般都不支援嵌套注釋,如果你這樣寫:

       /*one /* two */*/

 是行不通的。因為前置處理器在碰到第一個“*/”時就認為注釋已經結束!於是它把到這裡為止的注釋移除,可想而知,結果留下孤零零一個“*/”—編譯器又報錯了。

但是,同樣一段代碼,對於支援嵌套注釋的的編譯器而言,結果為都注釋掉。因為在two前面的/*會先匹配two後面的*/,one前面的/*匹配最後的*/(目測它與if,else語句的嵌套一樣,就近原則)

好了,知道了什麼是嵌套注釋,讓我們通過一個例子來繼續深入的理解嵌套注釋:

    /*/**/ "*/"/*" /**/

對於不支援嵌套注釋的編譯器而言:會將該代碼分為/*/**/,  "*/",  /**/三個部分,最後的結果是"*/";

對於支援嵌套注釋的編譯器而言:會將該代碼分為/*/**/"*/,  "/*",  /**/三個部分,最後結果是"/*"。

 

對於習題1-1,我們可以通過下面的代碼來檢測編譯器是否支援嵌套注釋,具體代目如下:

#include <iostream>#include <cstdio>using namespace std;int main() {    int ans = /*/*/0*/**/1;    printf("%d\n", ans);    return 0;}

/*/*/0*/**/1為 Doug McIlroy 發現,若編譯器支援嵌套注釋,則ans = 1;否則為0

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.