簡體   English   中英

如何確定要包括的頭文件?

[英]How to determine which header files to include?

說我有以下(非常簡單)的代碼。

#include <iostream>
int main() {
    std::cout << std::stoi("12");
}

這在g ++和clang上都可以編譯。 但是,它無法在MSVC上編譯,並出現以下錯誤:

錯誤C2039:“ stoi”:不是“ std”的成員

錯誤C3861:“ stoi”:找不到標識符

我知道std::stoi<string>標頭的一部分,大概兩個前編譯器都包含在<iostream> ,而后者不是。 根據C ++標准[res.on.headers]

C ++標頭可以包括其他C ++標頭。

對我來說,這基本上說所有三個編譯器都是正確的。

當我的一個學生提交作業時,這個問題就出現了,TA標記為未編譯。 我當然去修理了。 但是,我想防止將來發生此類事件。 因此,有沒有一種方法可以確定應該包括哪些頭文件,而無需在每次檢查的三個不同編譯器上進行編譯?

我能想到的唯一方法是確保對於每個std函數調用,都存在一個適當的include。 但是,如果您現有的代碼長數千行,則搜索起來可能很乏味。 有沒有更簡單/更好的方法來確保交叉編譯器的兼容性?

三種編譯器的示例: https : //godbolt.org/z/kJhS6U

有沒有更簡單/更好的方法來確保交叉編譯器的兼容性?

如果您有一個龐大的代碼庫並且到目前為止還沒有這樣做,那么這總是很麻煩的,但是一旦修復了包含內容之后,您可以堅持一個簡單的過程:

當您編寫使用標准功能(如std::stoi新代碼時,將該名稱插入Google,請轉至cppreference.com文章,然后在頂部查看其定義在哪個標頭中。

如果還不包括在內,則將其包括在內。 任務完成!

(您可以為此使用標准,但是訪問起來不太方便。)

不要試圖用廉價的,不可移植的黑客(<bits/stdc++.h>將其全部解雇!


tl; dr:說明文件

除了查看文檔並手動執行(痛苦且耗時)之外,您還可以使用一些可以幫助您完成此任務的工具。

您可以在能夠組織導入的Visual Studio中使用ReSharper(實際上,沒有ReSharper的VS不太有用)。 如果缺少include,建議添加它,如果它已過時,則include會以較淺的顏色顯示。

或者,您也可以使用具有此功能的CLion(適用於所有平台)(實際上這是同一制造商JetBrains)。

也有一個名為include的工具,您使用過 ,但是它的目的是利用前向聲明的優勢,我從未使用過(個人-我的隊友為我們的項目所做的)。

暫無
暫無

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

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