簡體   English   中英

C / C ++中的#include標頭

[英]#include headers in C/C++

在閱讀了有關編譯問題的幾個問題(特別是C ++)並注意到在許多情況下問題是缺少標題#include。 我忍不住想知道我的無知並問自己(現在對你):

為什么缺少標題不會自動檢查並添加或要求程序員?

例如,此類功能可用於Netbeans中的Java導入語句。

還記得java.util.Datejava.sql.Date之間的Java沖突嗎? 如果有人在他們的代碼中使用Date ,則無法判斷他們是否忘記import java.util.Dateimport java.sql.Date

在Java和C ++中,無法確定缺少哪些import / include語句。 所以兩種語言都沒有嘗 您的IDE可能會為代碼中使用的未聲明符號提供建議。

C ++中的問題更加復雜,因為標准規定任何標准頭文件都可以包含任何其他標准頭文件。 因此,在不直接包含定義它的頭的情況下使用函數或類非常容易,因為您的編譯器恰好間接包含了正確的頭。 根據它們是否共享該頭依賴性,生成的代碼在某些實現中起作用,但在其他實現中起作用。

一般來說,C ++ IDE無法判斷標頭依賴性是否“有保證”,或者僅僅是用戶不應依賴的附帶實現細節。 顯然,對於標准庫,它可以只知道在什么標題中定義了什么,但是一旦到達第三方庫,它就變得非常不確定。

我認為大多數C ++程序員都希望查找哪些標頭定義了哪些符號。 使用Java,one-public-class-per-file規則大大簡化了這一點,您只需導入所需的包/類。 C ++沒有包,IDE找到名為my_namespace::something::MyClass的類的唯一方法是在每個頭文件中搜索它。

為什么缺少標題不會自動檢查並添加或要求程序員?

但它們會自動檢查。

  1. 當找不到標題時,我的編譯器無法編譯。
  2. 我的IDE(eclipse)添加了一個視覺線索,當它找不到我已經#include的頭文件時,它會強調#include行,並提供一個工具提示,告訴我問題是什么。

它不會自動添加一個包含因為它無法知道哪些包含我忘了。 編譯器不是通靈的。

最后我記得,如果錯過了Import語句,Java也會拋出錯誤。 NetBeans GUI使您的生活更輕松。

可能你應該嘗試為你的C / C ++代碼找到一個智能的GUI。

因為第二個你信任計算機為你思考 ,你手上有一個重大的SkyNet案例。

一般而言,計算機在做出選擇時非常糟糕,除非是非常簡單的。 從依賴地獄中拉出一些東西根本不是你應該委托給它的任務,因為那種思維導致了草率的編碼和錯誤的代碼。

如果我引用一個名為sqrt的函數,編譯器如何知道要查找哪個文件,如果我沒有指定它? 它可能絕對是我整個硬盤上的任何文件。

與Java不同,C ++並不真正認為任何文件“特殊”。 Java有它的巨型(臃腫)類庫,程序員可以自動訪問它。

在C ++中,這個概念不存在。 您告訴編譯器要搜索哪些路徑,每當#include文件時,它將在這些路徑中搜索文件名。

如果碰巧找到標准庫文件,它將使用它。 如果碰巧找到第三方文件,它會使用它。

編譯器不知道math.h定義了sqrt 或者,它通常限定cmath實際上,通過一個報頭中定義的功能可能會有所不同 也許,如果我#define適當的預處理器符號,一些函數將從特定的標題中刪除,其他函數將被啟用。

但是與Java不同,Java只能通過檢查庫文件的元數據來確定庫定義的函數和類,而在C ++中,必須編譯頭文件。 編譯它的結果可能會有所不同,具體取決於包含它的上下文。

因此,C ++編譯器無法猜測應該包含哪個頭,以便定義您剛剛使用的函數。

編譯器不應該為你考慮。 如果兩個不同的庫中有相同名稱的功能怎么辦? 如何知道要包含哪個標頭以及要鏈接哪個庫? 在我看來,讓編譯器或IDE默默地修復你的草率代碼是一個壞主意。

部分差異是由於一些基本設計決策在兩者之間做出了不同的決定。 特別是,Java要求類的名稱與文件名匹配,因此您使用的類的名稱幾乎告訴它您需要導入的內容。

在C或C ++中,您為標題指定的名稱不一定必須與內容匹配。 如果你想要足夠嚴重,你可以命名你的標題1.h,2.h,3.h等等 - 甚至1.bas,2.pas,3.java,4.ada等等你喜歡的誤導性名字。 這顯然是一個糟糕的主意,但如果你這樣做了,編譯器就不會受到打擾。

因此,C或C ++工具更難以猜測需要包含哪個頭來獲取特定類型的定義。 從理論上講,它可以(例如)在你編寫的所有頭文件中構建一個包含所有函數,類,類型等的大數據庫,當你使用它時,告訴你哪個頭定義了什么名稱,但我不知道IDE實際上是這樣做的。

NetBeans是一個IDE(集成開發環境)。 有些C / C ++ IDE確實有這個功能......但不是每個人都知道它或利用它。

因為一般來說,知道需要包含哪些頭文件來正確定義內容是一個難題。 讓你的IDE能夠猜出簡單的案例並提供幫助是一個非常好的功能。

暫無
暫無

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

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