在 C++ 中,如果你想要在多个源文件中使用同一个全局变量,并且希望确保这个变量只被定义一次,那么在头文件中使用 extern
关键字声明变量是一个常见的做法。这样做可以避免变量被多次定义的错误。
不使用 extern
的情况
// main.cpp
#include "ImageInfo.h"
int main() {
ImageInfo imagInfo = {100, 100, {0.5, 0.5, 1.0}, SomeTransferSyntaxValue};
// 使用 imagInfo
return 0;
}
在这种情况下,你不需要在 ImageInfo.h
中声明 extern ImageInfo imagInfo;
,因为这个变量只在 main.cpp
中定义和使用。
使用 extern
的情况
如果你希望 imagInfo
在多个源文件中可用,并且确保它只被定义一次,那么你应该在头文件中使用 extern
关键字声明它,并在某个 .cpp
文件中定义它。例如:
// ImageInfo.h
#ifndef IMAGEINFO_H
#define IMAGEINFO_H
struct ImageInfo {
unsigned short Rows;
unsigned short Columns;
double Spacing[3];
E_TransferSyntax TransferSyntaxUID;
};
extern ImageInfo imagInfo;
#endif // IMAGEINFO_H
// ImageInfo.cpp
#include "ImageInfo.h"
ImageInfo imagInfo = {100, 100, {0.5, 0.5, 1.0}, SomeTransferSyntaxValue};
// main.cpp
#include "ImageInfo.h"
int main() {
// 使用 imagInfo
return 0;
}
总结
- 如果
imagInfo
只在一个源文件中使用,那么不需要在头文件中声明extern ImageInfo imagInfo;
。 - 如果
imagInfo
在多个源文件中使用,并且希望确保它只被定义一次,那么应该在头文件中使用extern
关键字声明它,并在某个.cpp
文件中定义它。
如果去掉 extern
的后果
如果你在头文件中去掉了 extern
关键字,并且在每个包含该头文件的源文件中都定义了 imagInfo
,那么你会得到一个链接错误,因为每个源文件都会尝试定义 imagInfo
,导致多次定义错误。
例如,如果你的头文件是这样的:
// ImageInfo.h
#ifndef IMAGEINFO_H
#define IMAGEINFO_H
struct ImageInfo {
unsigned short Rows;
unsigned short Columns;
double Spacing[3];
E_TransferSyntax TransferSyntaxUID;
};
ImageInfo imagInfo; // 错误:不应该在这里定义 imagInfo
#endif // IMAGEINFO_H
然后在两个不同的源文件中都包含了这个头文件,你会得到一个链接错误,因为 imagInfo
在每个源文件中都被定义了一次。
因此,如果你计划在多个源文件中使用 imagInfo
,那么在头文件中保留 extern ImageInfo imagInfo;
是非常重要的。