私の理解では、ELFオブジェクトファイルのシンボルはメモリアドレスの名前に過ぎません。言い換えれば、シンボル名を指定すると、リンカはC言語で宣言されている型にかかわらず、常に同じアドレスを参照する必要があります。externポインタで外部関数を宣言するエラー
私はそうではないと考えました。以下の例を参照:
/* 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)そうでない変換ミス
Iは、関数ポインタ(例えばextern void (*foo)(void)
)にfoo
とbar
の種類を変更しようとしたならないことを示し、出力は同じです。
もちろん、正しい宣言extern void foo(void)
で動作します。
私の理解に間違いがありますか?ありがとう。あなたはシンボルfoo
とbar
が参照アドレスを印刷していない
「この場所は、fooまたはbarの住所が「何にすべきか」とはまったく異なります。 –
@DanFego:-ffree-standingオプションでコンパイルするときにこの問題が発生したので、関数の正確な位置を知ることができました。 –
「extern void foo(void);」や「extern void bar(void)」のようなことをやっていないのはなぜですか? –