根据我的理解,ELF 目标文件中的符号只是内存地址的名称。换句话说,给定符号名称,链接器应始终引用相同的地址,无论它们在 C 中声明什么类型。
我发现事实并非如此。请参阅下面的示例:
/* a.c */
extern void *foo;
extern void *bar;
void main() {
printf("foo: %p, bar: %p\n", foo, bar)
}
/* b.c */
void foo(void) {
}
void bar(void) {
}
上述程序的输出显示 foo
和 bar
指向同一位置 (1)。而且这个位置与 foo
或 bar
的地址相去甚远。注(1)表示不可能不是转换错误
我尝试将 foo
和 bar
的类型修改为函数指针(例如 extern void (*foo)(void)
),输出仍然相同。
当然,只要使用正确的声明extern void foo(void)
,它就可以工作。
我的理解有什么错误吗?谢谢。 (我正在努力纠正我的理解,而不仅仅是让事情顺利进行)
最佳答案
您没有打印符号foo
的地址和bar
引用,但是foo
地址处的值和bar
.
打印foo
的地址和bar
你需要做这样的事情:
extern void *foo;
extern void *bar;
void main() {
printf("foo: %p, bar: %p\n", &foo, &bar);
}
关于c - 使用外部指针声明外部函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38342595/