今天在編譯一段C源程序時,遇到編譯錯誤提示 error: variably modified 'data' at file scope。原因在於代碼頭部有這樣幾行:
const int maxsize = 10000+10; int data[maxsize];
在C語言中,const不是一個真真正正的常量,其代表的含義僅僅是只讀。使用const聲明的對象是一個運行時對象,無法使用其作為某個量的初值、數組的長度、case的值或在類型的情形中使用。以上是全局的情況,那么僅在一個塊中定義的情況呢?下例中const所限定的值超出其生命周期后可被修改這很容易理解不必多作解釋。
1 for(i = 0; i < 6; ++i) { 2 const int j = i; // 試試 const int j = rand(); 3 printf("%d", j); // Output: 012345 4 }
如果要在C中定義編譯時常量,也就是一個真正的常量,可以使用#define宏定義,但是#define的問題在於它是直接替換源代碼中的所有匹配字符串,容易造成誤替換,因此對於像int型這樣的情況可以耍點小把戲,就像這樣:
1 enum {length = 256}; // Or: #define length 256 2 int a[length];
那么我們經常說const也並非不可修改,利用某些小技巧可以繞過只讀約束,下面的例子中被const限定的t就仍然可被修改:
1 const int t = 1; 2 *(int*)&t = 0; 3 printf("%d",t); // Output: 0
值得注意的是,在C++中可用const修飾的變量作為數組的長度。
參考鏈接: http://xsk.tehon.org/den/index.php/category/tech/c-variably-modified-array-at-file-scope.html