怎麼解決標頭檔案重複包含的問題,關於標頭檔案重複包含問題

2021-12-26 05:59:56 字數 2301 閱讀 2127

1樓:匿名使用者

不是很明白你的問題。層層包含出什麼問題了?

通常標頭檔案定義都會加上一些預編譯指令,讓標頭檔案在被多個檔案引用的時候不會多次編譯。比如classa.h裡面可以寫:

#ifndef _classa_h_

#define _classa_h_

// source code here

#endif //_classa_h_

或者直接使用#pragma once 指令

關於標頭檔案重複包含問題

2樓:匿名使用者

從問題補充來看應該是預處理上的順序問題.標頭檔案相互包含總會有一個檔案在另一個檔案中被忽略.因為預處理時include是將包含的檔案中的**插入到當前**裡,檔案是不能包含自己的,如果相互包含編譯器只能取捨一下,否則是不可能正常通過的.

在a.h中和在b.h中#include c.h, 在才c.h中include a.h和b.h,這樣的邏輯關係本來就有問題.

如果a.h被首先處理,那麼c.h中的a.h的內容很可能是被忽略了,這就導致了c.cpp找不到a的宣告.

解決方法就是重新分配定義所在的檔案,儘量讓包含關係呈樹狀結構,迴圈結構很容易出錯.

如果a,b中需要引用c,而c中又要引用ab,最好的做法就是都放到一個檔案裡,或者只將abc的宣告寫到一個總宣告檔案,再將abc的定義寫到一個檔案或者分別寫到對應的檔案,然後再在定義檔案裡包含總宣告檔案,如:

--------------------

public.h :

class a;

class b;

class c;

--------------------

a.h :

#include "public.h"

class a

--------------------

*********************************************

使用#ifndef

比如在head1.h裡用#ifndef套住要宣告的東西:

#ifndef head1_h

#define head1_h

//宣告的內容

#endif

這樣當標頭檔案被重複包含的時候會自動跳過.

3樓:匿名使用者

使用以下結構

#ifndef xx

#define xx

#endif

4樓:匿名使用者

使用#ifndef

#ifndef a_h

#define a_h

//a.h中宣告的內容

#endif

在c/c++中如何避免標頭檔案被多次包含?

5樓:米莫的菜

標頭檔案的最開始

加入這條雜注,就能夠保證標頭檔案只被編譯一次。

#pragma once是編譯器相關的

,就是說即使這個編譯系統上有效,但在其他編譯系統也不一定可以,不過現在基本上已經是每個編譯器都有這個雜注了。

#ifndef,#define,#endif是c/c++語言中的巨集定義,通過巨集定義避免檔案多次編譯。所以在所有支援c++語言的編譯器上都是有效的,如果寫的程式要跨平臺,最好使用這種方式具體寫法方式一:#ifndef __somefile_h__

#define __somefile_h__

... // 一些宣告語句#endif方式二:#pragma once

... ... // 一些宣告語句比較#ifndef的方式依賴於巨集名字不能衝突,這不光可以保證同一個檔案不會被包含多次,也能保證內容完全相同的兩個檔案不會被不小心同時包含。

當然,缺點就是如果不同標頭檔案的巨集名不小心「撞車」,可能就會導致標頭檔案明明存在,編譯器卻硬說找不到宣告的狀況

#pragma once則由編譯器提供保證:同一個檔案不會被包含多次。

注意這裡所說的「同一個檔案」是指物理上的一個檔案,而不是指內容相同的兩個檔案

。帶來的好處是,你不必再費勁想個巨集名了,當然也就不會出現巨集名碰撞引發的奇怪問題。對應的缺點就是如果某個標頭檔案有多份拷貝,本方法不能保證他們不被重複包含。

當然,相比巨集名碰撞引發的「找不到宣告」的問題,重複包含更容易被發現並修正。

方式一由語言支援所以移植性好,方式二 可以避免名字衝突

我還看到一種用法是把兩者放在一起的:

#pragma once

#ifndef __somefile_h__

... ... // 一些宣告語句#endif看起來似乎是想兼有兩者的優點。

C標頭檔案及函式呼叫的問題,如何在C 標頭檔案中定義函式,然後在原始檔中使用

c 的標頭檔案一般為變數宣告和函式宣告,巨集定義,以及include之類的東西。這些東西在matlab裡通通的不需要,變數可以直接拿來用。matlab的庫函式不用宣告也不用include都可以直接用。matlab裡自己定義的子函式只要將函式原始檔和主程式放在同一個工作目錄裡,就可以直接呼叫,不用宣告...

怎麼在html檔案中包含相關的js檔案

也可以直把js寫在html裡面js 如何在html檔案中包含其他html檔案 可以用iframe框架來解決 定義和用法 iframe 元素會建立包含另外一個文件的內聯框架 即行內框架 上面 中的src為另一個網頁 效果如下 可以使用iframe標籤。具體可參考 怎麼在js檔案中包含另一個js檔案 在...

怎麼解決p不能訪問win7共享檔案的問題

win7設定共享後,可以訪問xp的共享資料夾 xp可以進入win7的電腦瀏覽共享的目錄,但不能訪問win7共享的資料夾,提示沒有許可權。首先確認 1 兩臺機器的物理鏈路是暢通的 能ping通 2 兩個系統都已經開啟印表機和檔案共享 通過直接共享某個檔案即可實現 3 兩臺機器最好處於同一個工作組。解決...