1樓:踏岸尋柳
都是為了避免同一個檔案被include多次:
1 #ifndef方式
2 #pragma once方式
在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。
方式一:
#ifndef __somefile_h__
#define __somefile_h__
... ... // 一些宣告語句
#endif
方式二:
#pragma once
... ... // 一些宣告語句
#ifndef的方式依賴於巨集名字不能衝突,這不光可以保證同一個檔案不會被包含多次,也能保證內容完全相同的兩個檔案不會被不小心同時包含。當然,缺點就是如果不同標頭檔案的巨集名不小心「撞車」,可能就會導致標頭檔案明明存在,編譯器卻硬說找不到宣告的狀況
#pragma once則由編譯器提供保證:同一個檔案不會被包含多次。注意這裡所說的「同一個檔案」是指物理上的一個檔案,而不是指內容相同的兩個檔案。
帶來的好處是,你不必再費勁想個巨集名了,當然也就不會出現巨集名碰撞引發的奇怪問題。對應的缺點就是如果某個標頭檔案有多份拷貝,本方法不能保證他們不被重複包含。當然,相比巨集名碰撞引發的「找不到宣告」的問題,重複包含更容易被發現並修正。
方式一由語言支援所以移植性好,方式二 可以避免名字衝突。
一般可以這樣處理:
#infndef xx
#define xx
#if _msc_ver > 1000
#pragma once
#endif..
#endif
注意:_msc_ver 是出於版本相容性考慮,定義
defines the compiler version. defined as 1200 for microsoft visual c++ 6.0.
always defined.
2樓:
#pragma once
這個指令是後來才加的,以前的版本沒有。
新的 vc 2008 生成的**, 只在開頭地方加 #pragma once 一句了,其他的都省略了。
3樓:大愚漁人
常使用的#ifndef和#endif語句。
比如說在標頭檔案中要#define irremote_h,則可以使用#ifndef irremote_h
#define irremote_h
//如果重複,這裡的**將被跳過
#endif
4樓:匿名使用者
因為#pragma once是後來引入的功能。必須要在msc版本數滿足要求時才能使用。
5樓:匿名使用者
你如果是用的編譯器自帶的檔案,它們會自動判別的。
如果你自己定義的標頭檔案
簡單的在標頭檔案的這樣就可以了啊
myh1.h
#if! defined myh1
#define myh1
#endif
這樣你怎麼include都保證不會重複。
6樓:匿名使用者
c語言裡防止標頭檔案被重複定義的問題?
7樓:匿名使用者
graphics.h顯然是不行的,.在c語言中有專門的含義
另外巨集最好是遵循大寫的風格,約定俗成,不是說小寫不行,而是會帶來理解上的麻煩。
8樓:匿名使用者
恩,樓上對的,巨集定義約定用大寫,其實用graphics_h也不會報錯
graphics.h不是合法的巨集名,因為.,巨集名只能由字母數字下劃線組成,且以字母或下劃線開頭
9樓:匿名使用者
可以寫成graphics_h,但是通常巨集定義都寫成大寫的。 不能寫成graphics.h,巨集定義不能使用.來連線,語法錯誤
C 標頭檔案重複編譯問題 標頭檔案重複編譯
不會重複包含,你一開始用的巨集。ifndef cuser h define cuser h 就是防止重複包含的。另外,你可以不包含,然後在user前面做一個前置宣告 class string 然後把類成員 str宣告為指標,在cpp檔案裡面在引入標頭檔案。後面一種是比較好的做法。標頭檔案重複編譯 只...
include標頭檔案的作用是什麼?怎樣編寫標頭檔案
1 通過標頭檔案來呼叫庫功能。在很多場合,源 不便 或不準 向使用者公佈,只要向使用者提供標頭檔案和二進位制的庫即可。使用者只需要按照標頭檔案中的介面宣告來呼叫庫功能,而不必關心介面怎麼實現的。編譯器會從庫中提取相應的 2 標頭檔案能加強型別安全檢查。如果某個介面被實現或被使用時,其方式與標頭檔案中...
c語言中的標頭檔案是什麼概念,c語言標頭檔案的是幹什麼用的?
標頭檔案是你程式中需要用到東西,如需要某個數學函式,則必須包括數學相關標頭檔案,如math.h,當然,也可以自己寫函式,只要你不怕麻煩!標頭檔案是你程式中需要用到東西,如需要某個數學函式,則必須包括數學相關標頭檔案,如math.h,當然,也可以自己寫函式,只要你不怕麻煩!標頭檔案就是在你所編制的程式...