Sen fonksiyonunu yazmak ve bu şekilde uyarıları önleyebilirsiniz (ve gerek Fonksiyonunuzda ekstra makro için var):
#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;
}
Mac OS X 10.11 Açık gösterilen komut satırı ile temiz bir şekilde derler GCC 5.3.0 ile 0,4 (kaynak dosyası vui.c
olan): function parametresinden volatile
belirtilmemesi
$ gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
> -Wold-style-definition -Werror -c vui.c
$
uyarılar (hat numaraları ve eşleşmiyor değişken adlarına yol açar yukarıdaki kod; onlar kod önceki bir sürümü) elde edildi: Derleme Yukarıdaki kod uygulaması için ayrılmış bir ad kullanarak önler
…
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)
Not söyledi. Bir altçizgi ile başlayan tüm isimler ve büyük harf (ya da başka bir alt çizgi) uygulama için ayrılmıştır. ISO/IEC 9899 Bkz: 2011 §7.1.3 Ayrılmış tanımlayıcılar:
- bir alt çizgi ile başlar ve bir büyük harf ya da başka birini altını Tüm isimleri daima herhangi bir kullanım için ayrılmıştır.
- Alt çizgi ile başlayan tüm tanımlayıcılar, her zaman olağan ve etiket adı boşluklarında dosya kapsamı olan tanımlayıcılar olarak kullanım için ayrılır.
Bunun için neden bir '# define 'kullanırsınız; Ayrıca yazabilirsiniz * (volatile unsigned long *) _ REG = 0; ' –
Ve hangi uyarı üretilir? –
Bir altçizgi ve büyük harfle başlayan isimlerin 'uygulama' için ayrıldığını unutmayın - bu, bu tür isimleri kullanmamanız gerektiği anlamına gelir. –