我有一个情况建设有一个C ++编译器是C代码库,平行这样的:
lib.h
extern int const values[2] = {1, 2};
lib.c
#include "lib.h"
main.c中
#include <iostream>
extern int const values[2];
int main() {
std::cout << values[0] << ":" << values[1] << std::endl;
}
我不得不添加的,因为东西在指出的extern C ++ 03标准附录C兼容性C.1.2条款3 。 (编译与-fpermissive
将席卷这个的地毯下。)
顺便说一下它使怎么区别values
出现在objdump的是这样的前extern
:
$ objdump -t lib.o | grep values
0000000000000000 l O .rodata 0000000000000008 _ZL6values
$ objdump -t main.o | grep values
0000000000000000 *UND* 0000000000000000 values
......然后是这样的添加后:
$ objdump -t lib.o | grep values
0000000000000000 g O .rodata 0000000000000008 values
$ objdump -t main.o | grep values
0000000000000000 *UND* 0000000000000000 values
所以名字改编被放弃了,我们会看到一个“L”变成“G”,和链接器不会抱怨values
是不确定的。
现在想象有两个非常相似的文件,以同样的方式修改相同的情况:
TMP-exttypes.h
extern const REBYTE Reb_To_RXT[REB_MAX] = { /* bunch of stuff */ };
A-lib.c
extern const REBYTE Reb_To_RXT[REB_MAX];
这些项目只有两个Reb_To_RXT定义,建立清洁。 但它没有链接,当我objdump的仅有的两个文件提到它我得到:
$ objdump -t a-lib.o | grep Reb_To_RXT
00000000 *UND* 00000000 Reb_To_RXT
$ objdump -t f-extension.o | grep Reb_To_RXT
00000080 l O .rodata 00000038 _ZL10Reb_To_RXT
它说,L,和它的名字错位。 这并没有做出非常简单的例子高兴。 但我想知道这是怎么用的每一次亮相就可以了EXTERN发生。 我说得对不对相信这是一个冒烟的枪... ...,并且一般不应该发生的,只有声明为extern的东西不应该有本地联动,地方?