2017-09-01 60 views
2

所以我只是想知道,如果你#include something在例如header.h文件:如果您在.h文件中包含某些內容您是否必須再次包含相同的內容?

例如,這被稱爲header.h

#include <vector> 
#include <iostream> 
#include <somethingElse> 

所以,如果比如我做一個名爲something.cpp我需要把所有這些包括陳述再次?

#include "header.h" 
// If I include #header.h in this file. Do the #include carry over to this file. Or do they not 

我想知道,因爲每當我有<vector>東西在我的.h文件,我在.h文件以前使用的#include語句總是變成灰色,這意味着它們不使用。是因爲我在.h文件中使用了它嗎?它不是一個問題或任何我只是好奇。

+0

當您包含一個文件時,它基本上與複製文件內容而不是'#include'行一樣。這與頭文件中的#include行一樣,就像其他任何東西一樣。因此,如果頭文件包含'',將其重新包含在文件中是多餘的。 – Barmar

+0

所有的標準頭文件都被設計成包含額外的次數沒有效果,這就是爲什麼IDE顯示它沒有被使用。 – Barmar

+0

我想這個其他問題和答案解決這個https://stackoverflow.com/questions/6963143/headers-include-in-multiple-c-files(至少對於C) – Digits

回答

3

你不要需要包含這些頭了,因爲編譯器能夠找到這些頭,你可以嘗試閱讀和理解makefile (or CMakeList) ,這將有助於

2

嘗試總是避免通過「多文件包含」使用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。

你知道結果是什麼嗎?這是編譯時錯誤,抱怨重新定義了valuevalue2

在上面的例子中,我認爲綠色程序員不會被它困住,但它只是一個解釋,所以我說的是當一個巨大的程序中有許多頭文件和許多源文件以及一些文件包含其他文件跟蹤正確的文件包含會非常困難。

是解決方法使用inclusion guardspragma 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,所以它被添加到它。因此,如果在一個源文件中包含兩個頭文件,那麼如果沒有包含保護或編譯指令,那麼您會在那裏獲得重複的內容。