c防止標頭檔案重複include問題

時間 2021-08-30 10:26:27

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,當然,也可以自己寫函式,只要你不怕麻煩!標頭檔案就是在你所編制的程式...