想必很多人都看過“頭文件中的 #ifndef/#define/#endif 防止該頭文件被重復(fù)引用”贺归。但是是否能理解“被重復(fù)引用”是什么意思?是不能在不同的兩個(gè)文件中使用include來包含這個(gè)頭文件嗎师崎?如果頭文件被重復(fù)引用了,會(huì)產(chǎn)生什么后果椅棺?是不是所有的頭文件中都要加入#ifndef/#define/#endif 這些代碼犁罩?
其實(shí)“被重復(fù)引用”是指一個(gè)頭文件在同一個(gè)cpp文件中被include了多次齐蔽,這種錯(cuò)誤常常是由于include嵌套造成的。比如:存在a.h文件#include "c.h"而此時(shí)b.cpp文件導(dǎo)入了#include "a.h" 和#include "c.h"此時(shí)就會(huì)造成c.h重復(fù)引用床估。
頭文件被重復(fù)引用引起的后果:
有些頭文件重復(fù)引用只是增加了編譯工作的工作量含滴,不會(huì)引起太大的問題,僅僅是編譯效率低一些丐巫,但是對于大工程而言編譯效率低下那將是一件多么痛苦的事情蛙吏。
有些頭文件重復(fù)包含,會(huì)引起錯(cuò)誤鞋吉,比如在頭文件中定義了全局變量(雖然這種方式不被推薦,但確實(shí)是C規(guī)范允許的)這種會(huì)引起重復(fù)定義励烦。
是不是所有的頭文件中都要加入#ifndef/#define/#endif 這些代碼谓着?
答案:不是一定要加,但是不管怎樣坛掠,用ifnde xxx #define xxx#endif或者其他方式避免頭文件重復(fù)包含赊锚,只有好處沒有壞處。個(gè)人覺得培養(yǎng)一個(gè)好的編程習(xí)慣是學(xué)習(xí)編程的一個(gè)重要分支屉栓。
下面給一個(gè)#ifndef/#define/#endif的格式:
#ifndef A_H意思是"if not define a.h" 如果不存在a.h
接著的語句應(yīng)該#define A_H 就引入a.h
最后一句應(yīng)該寫#endif 否則不需要引入
#ifndef GRAPHICS_H // 防止graphics.h被重復(fù)引用
#define GRAPHICS_H
#include <math.h> // 引用標(biāo)準(zhǔn)庫的頭文件
…
#include “header.h” // 引用非標(biāo)準(zhǔn)庫的頭文件
…
void Function1(…); // 全局函數(shù)聲明
…
class Box // 類結(jié)構(gòu)聲明
{
…
};
#endif
--------------------------------------------------------------------------------------------------