簡體   English   中英

多包含一個.h文件

[英]Multi Including a .h File

在.h文件中,我將全局變量聲明為:

#pragma data_seg(".shared")
#ifndef DEF_VARX
#define DEF_VARX
int VARX=0;
#endif /*DEF_VARX*/
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")

但是,如果我將此文件包含在多個cpp文件中,則在嘗試編譯時,將收到“錯誤LNK2005:Dll.obj中已定義的“ int VARX”(?VARX @@ 3HA)”錯誤。 如果我僅包含一個cpp文件,則不會遇到任何問題。

#IFNDEF ....檢查是否足以防止這種情況發生? 我想念什么嗎?

此行為的原因是,您編譯該行

int VARX=0;

放入每個.obj文件。 可以編譯,但是在鏈接時,符號被多重定義,這是非法的。 使用

extern int VARX;

在頭文件中,以及

int VARX=0;

一個(只有一個)源文件中的文件解決了此問題。

我認為您應該在.h中轉發聲明該變量,然后在.cpp的共享部分中對其進行定義,如下所示:

// in a header file
#pragma once
extern int VARX;

// in a .cpp
#pragma data_seg(".shared")
int VARX=0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")

問題在於,對於給定的翻譯單元,您可以防止文件的多次包含。 (對於給定的說說cpp文件)

但是,如果您的多個cpp都包含此VARX.H,則此變量將具有多個定義。

相反,您只應在.H文件中聲明變量,而僅在一個位置將其初始化為0。

是的,您缺少extern關鍵字。

在頭文件中,使用:

extern int VARX;

在源文件中,實際上為變量聲明空間:

int VARX = 0;

ifdef禁止將其用作Separe目標文件。 當標頭包含在多個源(cpp)文件中時,VARX將在所有這些文件中定義。 考慮在頭文件中將其聲明為extern,並在一個cpp文件中進行初始化。

問題是您必須將文件包含在多個編譯單元中。 假設您有一個a.cpp和b.cpp。 兩者都包含您的頭文件。 因此,編譯器將分別編譯(和預處理),因此對於這兩個文件,尚未定義DEF_VARX。 當您將鏈接到目標文件鏈接在一起時,鏈接器會發現名稱沖突。

正如其他人所建議的那樣,解決方案是將其聲明為“ extern”,然后將實際值放置在cpp文件中,因此它僅被編譯一次,並鏈接到所有內容而不會發生名稱沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM