外部"C"与const

Tom*_*ner 2 c c++

我们的系统中有一段C代码,其中包含一些具有全局访问权限的数组:

source.h

extern const int magic[5];
Run Code Online (Sandbox Code Playgroud)

由source.c:

const int magic[] = { 1, 2, 3, 4, 5};
Run Code Online (Sandbox Code Playgroud)

有人认为将其更改为C++是一个好主意,所以上面的结果是一个extern "C"块:

source.h:

extern "C" { 
    const int magic[5]; 
}
Run Code Online (Sandbox Code Playgroud)

source.cc:

extern "C" {
    const int magic[] = { 1, 2, 3, 4, 5};
}
Run Code Online (Sandbox Code Playgroud)

编译时没有使用gcc -Wall发出吱吱声

直到有人试图使用该阵列我们发现了问题.使用const一个内部extern "C"的原因没有外部符号在所有生成.这发生在gcc,sun workshop和ibm的编译器上.

考虑到gcc没有警告你,你做的事情很奇怪,我有点不知道这是否是预期的行为.

这个标准所规定的行为也是如此,还是一个相当普遍的错误?

Mik*_*our 8

const变量具有内部链接(如同声明的那样static),除非您使用extern指定外部链接.如果要在一个源文件中定义它并从其他源文件访问它,则需要外部链接.

这是extern "C"用于指定语言链接的补充.

extern "C" { 
    extern const int magic[5]; 
}
Run Code Online (Sandbox Code Playgroud)

您的C声明正确指定了外部链接; 但是当你改为C++时你删除了它.