C語言編譯錯誤:Variably modified array at file scope


    今天在編譯一段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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM