0

在 GCC 中,如果变量声明为属性,并且在(静态)链接时没有找到定义,则该变量的地址为零,即,如果用变量的地址初始化指针,则指针将为NULL,如以下代码片段所示:

foob​​ar.c

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

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

主.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

我不认为我会期望这一点,我认为 GCC 会做同样的事情,就好像弱属性不存在一样。文档是:

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

...所以这看起来像未记录/未定义的行为。

于 2016-11-23T05:32:20.520 回答