嘗試總是避免通過「多文件包含」使用inclusion guard
或#pragma once
以防止包含多個文件。
包含文件意味着文件的內容將被添加到您寫的地方。
下面是一個例子:
// header.h
const int vlaue = 10;
const int value2 = 0;
// main.cpp
#include "header.h"
#include "header.h"
以上的 「header.h」 的內容被添加兩次的main.cpp。
你知道結果是什麼嗎?這是編譯時錯誤,抱怨重新定義了value
和value2
。
在上面的例子中,我認爲綠色程序員不會被它困住,但它只是一個解釋,所以我說的是當一個巨大的程序中有許多頭文件和許多源文件以及一些文件包含其他文件跟蹤正確的文件包含會非常困難。
是解決方法使用inclusion guards
或pragma once
例如:
讓我們修改我們的header.h
的樣子:
// header.h
#ifndef MY_HEADER_H
#define MY_HEADER_H
const int vlaue = 10;
const int value2 = 0;
#endif
現在main.cpp中:
#include "header.h"
#include "header.h"
#include "header.h"
上面的代碼工作正常,沒有重複的頭文件內容被添加到main.cpp。你知道爲什麼嗎?這是Macro的魔力。所以第一次預處理器檢查一個宏是否已經被定義爲MY_HEADER_H
或者沒有定義,並且第一次肯定它沒有被定義,因此內容被添加。第二個等條件失敗,因爲宏已經定義,因此header.h的內容不會被添加到它被調用的地方。
包含警衛的缺點是,如果你有一個與包含警衛同名的宏,因此它已經被定義,所以內容永遠不會被添加(空內容)。因此,你會得到一個編譯時錯誤:
value, `value2` undeclared identifiers.
第二個解決方案是使用pragma
如:
讓我們修改我們的header.h文件:
// header.h
#pragma once
const int vlaue = 10;
const int value2 = 0;
// main.cpp
#include "header.h"
#include "header.h"
上面的代碼工作正常所以沒這是因爲pragma once
的魔力:這是一個非標準但廣泛支持的預處理器指令,旨在使當前源文件在一次編譯中只包含一次。因此,#pragma曾經具有與包括守衛一樣的用途,但有幾個優點,包括:更少的代碼,避免名稱衝突,並且有時可以提高編譯速度。
最後,你應該包括頭無論其內容用於例如:
// Shape.h
class Shape{
// some code here
};
// Cube.h
#include "Shape.h"
class Cube : public Shape{
// some code here
};
// Cuboid.h
// #include "Shape.h"
#include "Cube.h" // So here the Shape.h is added to Cube.h and Cube.h is added here.
class Cuboid : public Cube{
// some code here
};
正如你可以看到Shape.h的內容上方加入到間接Cuboid.h,因爲它被添加到Cube.h和cuboid.h包含Cube.h,所以它被添加到它。因此,如果在一個源文件中包含兩個頭文件,那麼如果沒有包含保護或編譯指令,那麼您會在那裏獲得重複的內容。
當您包含一個文件時,它基本上與複製文件內容而不是'#include'行一樣。這與頭文件中的#include行一樣,就像其他任何東西一樣。因此,如果頭文件包含'',將其重新包含在文件中是多餘的。 –
Barmar
所有的標準頭文件都被設計成包含額外的次數沒有效果,這就是爲什麼IDE顯示它沒有被使用。 – Barmar
我想這個其他問題和答案解決這個https://stackoverflow.com/questions/6963143/headers-include-in-multiple-c-files(至少對於C) – Digits