文件具有一系列用作void*
的void声明,如下所示:
extern void __flash_rwdata_start;
...
initialize(&__flash_rwdata_start,
...
其仅由链接器脚本提供作为引用二进制划分的符号,如下所示(即指针):
PROVIDE (__flash_rwdata_start = LOADADDR(.rwdata));
这将生成以下警告:
file.c:84:19: warning: taking address of expression of type 'void' [enabled by default]
根据对Why has GCC started warning on taking the address of a void expression?的回答,我将其更改如下(接受指针的函数无论如何都使用unsigned long*
):
extern unsigned long __flash_rwdata_start;
现在我突然想到,原来的定义隐含了零(或未定义)大小,而当前的定义没有,而且与Why has GCC started warning on taking the address of a void expression?的答案不同,没有任何逻辑意义上的“真实的的底层数据类型”。
实际上,我定义了一个有效的指针,但是它没有指向一个有效的值,因此解引用是无效的。
有没有更安全或更好的方法来避免警告,但没有空间分配的想法,这不能被解引用?
2条答案
按热度按时间7ajki6be1#
我们想到的一个想法是让对象的类型成为一个不完整的结构体,例如:
这样,地址将是有效的,但是,只要类型从未被定义,就不能被取消引用。
n53p2ov02#
为了完整性,除了“void”(至少不符合C11)之外,通常的方式是
extern char __flash_rwdata_start[];
不过我还是更喜欢汤姆的回答。