#include <stdio.h>
volatile int isInit_STD;
volatile int isInit_STD;
int main() {
printf("v-%d-addr%x\n",isInit_STD,&isInit_STD);
isInit_STD = 1;
printf("v-%d-addr%x\n",isInit_STD,&isInit_STD);
return 0;
}
結果是:
v-0-addr387fd040
v-1-addr387fd040
為什么 volatile 可以重復宣告?
事實證明,它們都是相同的,相同的地址。
如果其中之一洗掉了'volatile',則無法編譯成功。
我想知道原因,期待您的回復。
uj5u.com熱心網友回復:
C標準說(C17 6.7/4)
同一范圍內參考同一物件或函式的所有宣告應指定兼容的型別。
這意味著只要您使用相同的名稱、相同的型別和相同的型別限定符(volatile 等),您可以隨意宣告該變數,并且它都將參考同一個物件。
反之亦然:如果您使用不同的型別或限定符,但為變數提供相同的名稱,則違反約束,編譯器必須發出診斷訊息。
除了標準 C 允許的內容外,常識表明我們應該盡可能避免對同一個變數進行多次宣告。良好的程式設計實踐還指出,我們應該避免在檔案范圍內宣告物件,或者如果不可能,避免使用外部鏈接(“全域”),而是通過宣告變數來強制內部鏈接static。
uj5u.com熱心網友回復:
我想知道原因
只要宣告“相同”,您可以根據需要多次重復宣告任何內容。它不是特定于volatile,只是必須沒有沖突。所有宣告都指的是同一件事。
以下是實際的整個 .c 檔案:
// 3 declarations of function main.
int main();
int main();
int main();
// 3 declarations of struct A type.
struct A;
struct A;
struct A;
// 3 declarations of variable a
extern volatile int a;
extern volatile int a;
extern volatile int a;
// 3 declarations of variable b
int b;
int b;
int b;
// 3 declarations of variable c
volatile int c;
volatile int c;
volatile int c;
// example with conflicts:
int d;
// volatile int d; // error - conflict with above, d is not volatile
// static int d; // error - conflict with above, d is not static
extern int d; // Fine! Stuff declared at file scope is implicitly extern.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/512697.html
標籤:C易挥发的
