0

GCC では、変数がweak属性で宣言され、(静的) リンク時に定義が見つからない場合、変数のアドレスは0になります。つまり、ポインターが変数のアドレスで初期化される場合、ポインターは次のコード スニペットが示すように、NULLである必要があります。

foob​​ar.c :

extern int foo __attribute__((weak));
extern int bar;

int *a[] = {&foo, &bar};

main.c :

#include <diag/Trace.h>

//int foo;
int bar;
extern int *a[];

int main(void) {
    trace_printf("%p, %p", a[0], a[1]);
    return 0;
}

出力は次のとおりです: 0, 0x20000120 (私は arm-none-eabi-gcc 5.4.1 を使用しています)

問題は、この動作は予期されたものであるにもかかわらず、それについて言及されたドキュメントがないということです。この動作を説明する資料を誰かに教えてもらえますか? ありがとう!

4

1 に答える 1

0

私はそれを期待していないと思います.weak属性が存在しない場合と同じことをGCCが行うと思います。ドキュメントは次のとおりです。

https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes

...したがって、これは文書化されていない/未定義の動作のように見えます。

于 2016-11-23T05:32:20.520 に答える