それは揮発性メモリへのポインタを期待するように、あなたの関数を記述し、その方法は、あなたが警告を回避することができます(と機能で余分なマクロの必要はありません):MacのOS X 10.11で
#define GPIO_PORTF_DATA_R (*((volatile unsigned long *)0x400253FC))
static void ZeroRegister(volatile unsigned long *REG)
{
*REG = 0;
}
int main(void)
{
ZeroRegister(&GPIO_PORTF_DATA_R);
return 0;
}
示されているコマンドライン(ソースファイルがvui.c
である)できれいにコンパイルGCC 5.3.0と0.4:警告につながる関数パラメータから
volatile
を省略
$ gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
> -Wold-style-definition -Werror -c vui.c
$
(行番号と変数名が一致しません上記のコード。それらは、コードの以前のバージョン)から作製した:コンパイル・コードは、上記実施のために予約名を使用して回避
…
vui.c: In function ‘main’:
vui.c:11:18: error: passing argument 1 of ‘ZeroRegister’ discards ‘volatile’ qualifier from pointer target type [-Werror=discarded-qualifiers]
ZeroRegister(&GPIO_PORTF_DATA_R);
^
vui.c:3:6: note: expected ‘long unsigned int *’ but argument is of type ‘volatile long unsigned int *’
void ZeroRegister(unsigned long * _REG)
留意されたいです。アンダースコアと大文字(または別のアンダースコア)で始まるすべての名前は、実装用に予約されています。 ISO/IECに9899を参照してください:2011§7.1.3予約識別子:
- アンダースコアと大文字または別のアンダースコアのいずれかで始まるすべての識別子は常に使用するために予約されています。
- アンダースコアで始まるすべての識別子は、通常とタグの名前空間の両方でファイルスコープの識別子として使用するために予約されています。
なぜ、このために '#define'を使用しますか? '*(volatile unsigned long *)_ REG = 0; 'と書くこともできます。 –
警告はどのように生成されますか? –
アンダースコアと大文字で始まる名前は '実装'用に予約されています。つまり、そのような名前を使用しないでください。 –