const關(guān)鍵字可以說是用途廣泛,從對變量的限定到對函數(shù)的限定,尤其是那個指向常量的指針(const int *p),指針常量(int * const p),指向常量的指針常量(const int* const p)更讓初學(xué)者摸不到頭腦。這里我主要想描述下最近項目中關(guān)于const的一個問題。簡單代碼如下:
int main()
{
const int a = 100;
int* p = (int *)&a;
*p = 200;
printf("\n%x\t%d", p, *p);
printf("\n%x\t%d", &a, a);
return 0;
}
VC 6.0 運行結(jié)果:
12ff7c 200
12ff7c 100
我看了下跟蹤到內(nèi)存12ff7c里確實放著200,這讓我百思不得其解。于是我用gcc version 3.2.2 20030222
運行結(jié)果如下:
bfffdee4 200
bfffdee4 200
那么經(jīng)過跟高手討教得出:
第二個PRINTF打印出的100不是當時a的內(nèi)容,而是vc 6.0編譯優(yōu)化,看見const后,直接將100放在要打印的a的地方,類似于#define,所以輸出的還是100。那么最好的是使用volatile const int a = 100,一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設(shè)這個變量的值了。精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。所以。。。
經(jīng)過這個東西我看到了其實除了學(xué)習(xí)c++語言本身外,還是要了解一些編譯器的基本信息,是不是應(yīng)該開編譯選項之類的值得我們?nèi)ド钏肌?br>