C语言 有没有一种安全的方法可以引用链接器专用符号,而不使用void表达式的地址?

mm9b1k5b  于 2023-02-15  发布在  其他
关注(0)|答案(2)|浏览(101)

文件具有一系列用作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?的答案不同,没有任何逻辑意义上的“真实的的底层数据类型”。
实际上,我定义了一个有效的指针,但是它没有指向一个有效的值,因此解引用是无效的。
有没有更安全或更好的方法来避免警告,但没有空间分配的想法,这不能被解引用?

7ajki6be

7ajki6be1#

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

extern struct never_defined __flash_rwdata_start;

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

n53p2ov0

n53p2ov02#

为了完整性,除了“void”(至少不符合C11)之外,通常的方式是
extern char __flash_rwdata_start[];
不过我还是更喜欢汤姆的回答。

相关问题