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

頭に浮かぶアイデアの 1 つは、オブジェクトの型を次のような不完全な構造体にすることです。

extern struct never_defined __flash_rwdata_start;

この方法では、アドレスは有効になりますが、型が定義されていない限り、逆参照できません。

于 2015-02-20T03:23:10.213 に答える