我们的系统中有一段C代码,其中包含一些具有全局访问权限的数组:
source.h
extern const int magic[5];
由source.c:
const int magic[] = { 1, 2, 3, 4, 5};
有人认为将此更改为C ++是个好主意,因此上述内容最终会出现在extern "C"
块中:
source.h:
extern "C" {
const int magic[5];
}
source.cc:
extern "C" {
const int magic[] = { 1, 2, 3, 4, 5};
}
编译时没有使用gcc -Wall
发出吱吱声直到有人试图使用我们发现问题的那个数组时才开始。在const
内使用extern "C"
会导致根本不生成外部符号。这发生在gcc,sun workshop和ibm的编译器上。
我有点不知道这是否是预期的行为,因为gcc没有警告你,你做了一些奇怪的事情。
标准规定的这种行为也是如此,还是一个相当普遍的错误?
答案 0 :(得分:8)
const
指定外部链接,否则 static
变量具有内部链接(如同声明为extern
)。如果要在一个源文件中定义它并从其他源文件访问它,您需要外部链接。
除了使用extern "C"
指定语言链接之外,还有其他内容。
extern "C" {
extern const int magic[5];
}
您的C声明正确指定了外部链接;但是当你改为C ++时你删除了它。