2013-03-27 22 views
1

我在VS2012中使用預編譯頭文件中有一個非常基礎的項目。我知道我應該將所有「常用」包括到stdafx.h中,並且我需要將它包含在每個.cpp文件中。因此,基本設置是這樣的:VS2012預編譯頭文件:我的.h文件如何知道包含在stdafx.h中?

了foo.h:

#ifndef FOO_H 
#define FOO_H 

class Foo { 

public: 
    Foo(); 
    ~Foo(); 

    void do(string str); 
}; 
#endif 

foo.c的:

#include "stdafx.h" 
#include "Foo.h" 

void Foo::do(string str) {} 

Stdafx.h中:

#include <string> 
using namespace std; 

沒有預編譯頭,我將#include <string>放入foo.h中,因爲它必須知道string的聲明。但是這個foo.h在這個設置中怎麼知道string? (請注意,stdafx.h僅包含在.cpp文件中)。

注意:我有一個使用預編譯頭文件的工作示例;問題是關於這是如何工作的。

+2

樣式說明:在標頭文件中放置'using namespace std;'確實會污染全局名稱空間。使用明確的命名空間(例如,參考'std :: string') – Joe 2013-03-27 13:47:34

+1

@Joe:只是爲了確保我理解正確:而不是'使用命名空間標準;'我應該使用'std:string'每當我需要一個字符串? – mort 2013-03-27 13:56:48

回答

2

這是因爲編譯器按它們出現在主編譯單元中的順序處理標題。

由於.cpp文件包括<string>(間接地經由"stdafx.h")的<string>內容是已知的編譯器,並且可以通過以下討論中,甚至從代碼的頭文件中拉出代碼中使用。

雖然它很脆弱,因爲包括頭文件在內的首先包括<string>都會導致錯誤。

+0

從技術上講,這是因爲'stdafx.h'包含在'Foo.h'前面,前者拉入''。 – Joe 2013-03-27 13:48:28

+0

@Joe:是的,這就是我在第一句中提到的。 – 2013-03-27 13:49:09

1

您可以將預編譯頭文件看作頭文件緩存的一種。編譯器首次遇到它時分析一組頭(通常在編譯stdafx.cpp時),編譯它們,然後將結果準備好供任何需要它們的模塊使用。

相關問題