由於聲明不匹配,顯然未定義。如您所述,const int
和int
是不兼容的類型。僅當診斷出現在相同範圍內時才需要診斷。
這不是在實踐中既安全,考慮
$ cat test1.c
#include <stdio.h>
extern const int n;
void foo(void);
int main(void) {
printf("%d\n", n);
foo();
printf("%d\n", n);
}
$ cat test2.c
int n;
void foo(void) { ++n; }
$ gcc -std=c99 -pedantic test1.c test2.c && ./a.out
0
1
$ gcc -O1 -std=c99 -pedantic test1.c test2.c && ./a.out
0
0
gcc的假設進行優化後n
不foo()
改變,因爲它可能會承擔n
的定義是一個兼容型的,從而const
。
很可能你會得到預期的行爲volatile
-qualifying n
in test1.c
,但就C標準而言,這仍然是未定義的。
我能想到的,以防止用戶意外修改n
最好的辦法是一個指針申報const
,沿
int my_real_variable;
const int *const my_variable = &my_real_variable;
或者是一些宏觀
#define my_variable (*(const int *)&my_variable)
隨着C99的東西, my_real_variable
可以通過複合文字避免:
const int *const my_variable_ptr = &(int){ 12 };
在這裏丟棄const
是合法的(因爲int
對象本身不是const
),但是需要強制轉換,以防止意外修改。
如果放棄'const' quialifier,編譯器可能會抱怨,如果它是另一種方式。但我不太確定。 –
我很確定[C - 通過const聲明訪問非const](http://stackoverflow.com/q/8051969/1708801)涵蓋了這種情況。 –
可能值得指定您所指的確切的C標準版本。 – Clifford