淺談#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編譯了; 然後再根據
加上ifndef/define/endif,就可以防止這種重定義錯誤。
(3)另外還有一點需要注意:
在其他檔案如main.cpp在使用StdAfx.h的同時又用到其他函式庫時,要注意函式庫放的位置
如:
main.cpp:
#include<stdio.h>
#include"StdAfx.h"
.........
執行時會出現錯誤!!!!原因:
編譯器通過一個頭檔案stdafx.h來使用預編譯標頭檔案。編譯器認為,所有在指令
因此,所有的MFC實現檔案第一條語句都是:#include"stdafx.h"。在它前面的所有程式碼將被忽略,所以其他的標頭檔案應該在這一行後面被包含。否則,你將會得到“Nosuchfileordirectory”這樣讓你百思不得其解的錯誤提示。
所以要把#include"StdAfx.h"放在最前面(下面是正確的形式)
main.cpp:
#include"StdAfx.h"
#include<stdio.h>
.........