VC中預處理指令與巨集定義的妙用(1)

2021-04-01 22:43:29 字數 1068 閱讀 9252

monday, june 24 2002 11:28 am

乙個經典的例子

[被遮蔽廣告]

使用預處理與巨集定義最經典的例子莫過於加在乙個標頭檔案中以避免標頭檔案被兩次編譯。試想這種的情況,有乙個檔案headerfile.h 它被包含在headerfile1.h中,同時在headerfile2.h 中也被包含了,現在有乙個cpp檔案,implement.cpp 包含了headerfile1.h 和headerfile2.h:

#include 「headerfile1.h」

#include 「headerfile2.h」

假設headerfile.h 中定義了乙個全域性變數 iglobal 。

int iglobal;

在編譯的時候編譯器兩次編譯headerfile,也就會發現iglobal被定義了兩次,這時就會發生變數重定義的編譯錯誤。

傳統的解決辦法是使用#ifdef 以及#endif 來避免標頭檔案的重複編譯,在上面的例子中,只需要加上這麼幾行:

#ifndef **artnose_2002_6_21_headerfile_h

#define **artnose_2002_6_21_headerfile_h

int iglobal;

#endif

仔細的考慮上面的巨集定義,會發現當編譯器編譯過一次headerfile.h以後,**artnose_2002_6_21_headerfile_h 這個巨集就被定義了,以後對headerfile.h的編譯都會跳過int iglobal 這一行。當然**artnose_2002_6_21_headerfile_h 這個巨集是可以任意定義的,但是這個巨集本身不能和其它檔案中定義的巨集重複,所以mfc在自動生成的檔案中總是使用乙個隨機產生的長度非常長的巨集,但我覺得這沒有必要,我建議在這個巨集中加入一些有意義的資訊,比方作者,檔名,檔案建立時間等等,因為我們有時候會忘記在注釋中加入這些資訊。

在vc.net 中我們不會再看見這些巨集定義了,因為在這裡會普遍使用乙個預處理指令:

#pragma once

只要在標頭檔案的最開始加入這條指令就能夠保證標頭檔案被編譯一次,這條指令實際上在vc6中就已經有了,但是考慮到相容性並沒有太多的使用它。

VC預處理指令與巨集定義的妙用

vc預處理指令與巨集定義的妙用 2008年04月02日 星期三 下午 06 36 vc預處理指令與巨集定義的妙用 剛接觸到mfc程式設計的人往往會被mfc 嚮導生成的各種巨集定義和預處理指令所嚇倒,但是預處理和巨集定義又是c語言的乙個強大工具。使用它們可以進行簡單的源 控制,版本控制,預警或者完成一...

預處理指令與巨集

剛接觸到mfc程式設計的人往往會被mfc 嚮導生成的各種巨集定義和預處理指令所嚇倒,但是預處理和巨集定義又是c語言的乙個強大工具。使用它們可以進行簡單的源 控制,版本控制,預警或者完成一些特殊的功能。乙個經典的例子 使用預處理與巨集定義最經典的例子莫過於加在乙個標頭檔案中以避免標頭檔案被兩次編譯。試...

VC中預處理指令的詳解

在所有的預處理指令中,pragma 指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。pragma指令對每個編譯器給出了乙個方法,在保持與c和c 語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有的,且對於每個編譯器都是不同的...