我正在阅读此链接如何在 C++ 中使用数组?,第 5 节。使用数组时的常见陷阱,示例如下:
// [numbers.cpp]
int numbers[42] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// [main.cpp]
extern int* numbers;
int main()
{}
由于 numbers.cpp 中的 'numbers' 是数组的名称,它通常可以衰减为等于' &numbers[0] '的指针,我希望 main.cpp 中的 'numbers' 值仍然是 '&numbers[0]' . 但不是!相反,它是“数字[0] ”,即“1”。
或者假设我是编译器,在 'numbers.cpp' 中,我看到符号 'numbers' 作为指向 '1' 的地址,为什么在 'main.cpp' 中这个相同的符号更改为值 1 '?
我明白这就是作者所说的“类型不安全的链接”。但我不知道为什么编译器会这样做,即使编译器只是引发类型不匹配的链接错误对我来说更有意义。
注释
我想我的理解是,编译器在下面看到是等效的,以便链接器成功,否则会出现“未解决的外部”错误:
// [numbers.cpp]
int tmp[42] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; //{1,..9} starts at global address 0x1234
int *numbers = &tmp[0]; //numbers == 0x1234
// [main.cpp]
extern int* numbers; //numbers == 0x1234
int main()
{}
真实情况:
// [numbers.cpp]
int numbers[42] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; //{1,..9} starts at global address 0x1234
// [main.cpp]
extern int* numbers; //numbers == numbers[0] == 1
int main()
{}