2015-11-05 86 views
7

AFAIK,符號可用於防止多重解析。如果兩個A.H和b.h包括c.h,一個C++符號的範圍

#ifndef C_H 
#define C_H 
... 
// c.h definition would go here 
... 
#endif 

將阻止c.h被「解析的」(我認爲這是不正確的字)一次以上。

不過,我已經看到過類似

#ifdef WIN32 
... 

在別人的代碼。該符號必須已被定義在其他地方,因爲搜索

#define WIN32 

在整個項目中返回空白。我的問題是:這些符號實際上定義在哪裏?操作系統是否保持類似於不同程序可用於查詢操作系統或其他進程屬性的符號池?

+0

可以從命令行設置/ ide選項設置預處理器定義。在VS中,查看「C/C++ - >預處理器」。 –

回答

5

有兩種選擇其中那些不是在代碼本身可以都來源於:

  1. 編譯器套件本身將其設置爲默認,當你開始編譯代碼。
  2. 當您編譯代碼時(或者您的IDE項目首選項使用IDE時,您可以向編譯器(或準確預處理器)提供這些定義的列表。例如,在Visual Studio 2013中,您會發現當你打開項目>屬性>配置屬性> C/C++>預處理器>預處理器定義)。

一般來說,這些定義不僅用於您描述的原因(包括保護),還用於基於您開發的平臺啓用或禁用代碼 - 例如,您可以僅使用代碼分支編譯爲Windows,或者只有當您使用64位編譯器。

+0

輝煌。非常感謝。 – roymcclure

1

AFAIK這是你使用的編譯器的一部分。

1

Microsoft C++編譯器內部定義了一些宏如WIN3​​2,這就是爲什麼它沒有在任何特定的頭文件中定義。所以當你使用VC++創建一個源文件時,#ifdef WIN32內部的東西會被編譯,但不會在Linux gcc上。

此外,您的術語有點偏離 - 這些被稱爲預處理器宏,而不是符號。代碼中變量,函數等的名稱是符號。

+0

太好了,謝謝你的提示。 – roymcclure

1

每個編譯器都有一個定義的宏列表。當編譯目標是32位Windows時,MSVC定義WIN32。

+0

它也定義了WIN32的目標是64位Windows時我相信(因爲微軟) – kcraigie