3

一个文件有一系列 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]

根据问题 http://stackoverflow.com/questions/27263344 的答案,我已将其更改如下(unsigned long*无论如何,获取指针的函数都使用):

extern unsigned long __flash_rwdata_start;

现在我想到原始定义的大小为零(或未定义),而当前定义没有,并且与问题27263344的答案不同,没有任何逻辑意义上的“真正的基础数据类型”。

本质上,我定义了一个有效的指针,但不指向有效值,因此取消引用是无效的。

有没有更安全或更可取的方法来避免警告,但没有分配空间的想法,不能取消引用?

4

2 回答 2

2

想到的一个想法是使对象的类型成为不完整的结构,例如:

extern struct never_defined __flash_rwdata_start;

这样地址将是有效的,但是,只要该类型从未定义,就不可取消引用。

于 2015-02-20T03:23:10.213 回答
0

为了完整起见,除了“void”(至少不符合 C11)之外的常用方法是

extern char __flash_rwdata_start[];

不过,我确实更喜欢汤姆的回答。

于 2016-09-15T22:22:20.010 回答