有没有一种安全的方法来引用仅链接器符号而不使用 void 表达式的地址?

Is there a safe way to refer to linker-only symbols that without taking the address of void expressions?

一个文件有一系列用作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 ://whosebug.com/questions/27263344 的回答,我将其更改如下(获取指针的函数无论如何都使用 unsigned long*):

extern unsigned long __flash_rwdata_start;

现在我想到原来的定义暗示了零(或未定义)大小,而当前的定义没有,而且与问题 27263344 的答案不同,没有 "real underlying data type" 合乎逻辑。

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

是否有更安全或更好的方法来避免警告,但没有分配 space 的想法,无法取消引用?

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

extern struct never_defined __flash_rwdata_start;

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

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

extern char __flash_rwdata_start[];

不过我更喜欢 Tom 的回答。