回覆列表
  • 1 # 嵌入式攻城獅

    #include 是一條編譯器的指令,他會在系統標頭檔案目錄和指定目錄下去尋找標頭檔案。如果找不到就不會透過編譯。雖然你可以嘗試修改gcc原始碼,來實現找不到檔案是輸出null。但那沒有意義,因為你找不到標頭檔案,那標頭檔案裡面宣告的變數、函式、宏定義你都用不了,如果用了也會報錯,無法透過編譯。遇到找不到標頭檔案的問題,第一時間應該看看你的makefile或者IDE工具指定的標頭檔案目錄有沒有包含標頭檔案。然後再找有沒有這個標頭檔案。

  • 2 # 編碼之道

    我會在後面附上一種實現這種功能的辦法,但是我想說這樣做毫無意義,即使你可以透過一些手段編譯成功,甚至達到輸出NULL的目的,但是你的程式卻很可能無法執行,或者執行時出錯。

    C語言作為一種靜態編譯型語言,在編譯階段或者預編譯階段發現錯誤要比執行時發現錯誤更有意義,所以現在的編譯器才會越做越智慧,幫你檢查出程式潛在的問題,提示你修改,包括找不到include指定的檔案,所有的這一切的目的只有一個,就是提早發現問題,使執行時的程式更加健壯、高效。

    那麼如何強行實現這種功能呢,最直接的方法當然是修改編譯器,這對於大部分商業編譯器來說是不可行的,因為你沒有原始碼,但是像gcc這樣的開源軟體,還是可以嘗試一下,不過難度較大,會改的人絕對不會做這種無意義的事。

    我要說的另一種簡單方式是自己寫一個檢測工具,功能很簡單,就是分析每條include指令,然後檢查檔案是否存在,對於不存在的問題,將該條指令替換成一條輸出null的語句,比如:

    #include “

    file1.h

    ” // 存在

    #include “

    file2.h

    ” // 不存在

    // 檔案記憶體

    執行檢測工具後:

    #include “file1.h” // 存在

    print("null in file %s at line %d",__FILE__,__LINE__);

    // 檔案內容

    然後在編譯前執行這個工具,對於沒有使用到的include檔案,該方法將達到輸出null的目的,對於檔案中使用到了include檔案中的內容,比如變數、宏或者函式等,都會提示編譯錯誤。

    下面是在VC2017中設定自定義工具的辦法,如下圖:

    開啟專案屬性->自定義生成步驟->配置相關引數。

  • 中秋節和大豐收的關聯?
  • 大寶兩歲了,剖腹產,什麼時候要二寶更合適?