1. 程式人生 > >淺談#ifndef~#define~#endif~的作用

淺談#ifndef~#define~#endif~的作用

 /*
#ifndef _STDAFX_H
#define _STDAFX_H

#include<iostream.h>         //cin  cout
#include<malloc.h>           //malloc  free
#include<string.h>           //strcpy
#include<stdlib.h>           //exit()

#endif
*/  

1)內容:在標頭檔案(StdAfx.h)開頭寫上兩行:

#ifndef _STDAFX_H

#define _STDAFX_H//一般是檔名的大寫

············

············

標頭檔案結尾寫上一行:

#endif

2)作用: 主要目的是防止標頭檔案的重複包含和編譯

例如:

假設你的工程裡面有4個檔案,分別是 a.cpp , b.h,  c.h,   d.h。 
a.cpp的頭部是: 
#include   "b.h " 
#include   "c.h " 
b.h和c.h的頭部都是: 
#include   "d.h " d.h裡面有int a,即a的定義。 這樣一來, 編譯器編譯a.cpp的時候,先根據#include   "b.h "去編譯b.h這個檔案,再根據b.h裡面的#include   "d.h ",去編譯d.h的這個檔案,這樣就把d.h裡面的int a編譯了; 然後再根據

a.cpp的第二句#include   "c.h ",去編譯c.h,最終還是會找到的d.h裡面的int a,但是int a之前已經編譯過了,所以就會報重定義錯誤。 

加上ifndef/define/endif,就可以防止這種重定義錯誤。

3)另外還有一點需要注意:

在其他檔案如main.cpp在使用StdAfx.h的同時又用到其他函式庫時,要注意函式庫放的位置

如:

main.cpp:

#include<stdio.h>

#include"StdAfx.h"

.........

執行時會出現錯誤!!!!原因:

編譯器通過一個頭檔案stdafx.h來使用預編譯標頭檔案。編譯器認為,所有在指令

#include"stdafx.h"前的程式碼都是預編譯的,它跳過#include"stdafx.h"指令,使用projectname.pch編譯這條指令之後的所有程式碼。

因此,所有的MFC實現檔案第一條語句都是:#include"stdafx.h"。在它前面的所有程式碼將被忽略,所以其他的標頭檔案應該在這一行後面被包含。否則,你將會得到“Nosuchfileordirectory”這樣讓你百思不得其解的錯誤提示。

所以要把#include"StdAfx.h"放在最前面(下面是正確的形式)

main.cpp:

#include"StdAfx.h"

#include<stdio.h>

.........