2011-09-03 118 views
2
#include <stdio.h> 
int const NAMESIZE = 40; 
int const ADDRSIZE = 80; 
typedef char NameType[NAMESIZE]; 
typedef char AddrType[ADDRSIZE]; 

typedef struct 
{ 
    NameType name; 
    AddrType address; 
    double salary; 
    unsigned int id; 
}EmpRecType; 

int main(int * argc, char * argv[]) 
{ 
    EmpRecType employee; 
    return 0; 
} 

如果我使用#define而不是const,它會編譯。 這是錯誤:任何人都知道爲什麼這個C代碼不會編譯?

employee.c:5:14:錯誤:6:14:錯誤:可變地在文件範圍 employee.c改性 'NAMETYPE' 可變改性 'ADDRTYPE' 在文件範圍

+1

沒有給出什麼錯誤? –

+1

[文件範圍內可變修改數組]的可能重複(http://stackoverflow.com/questions/1712592/variably-modified-array-at-file-scope) –

+2

不應該是'const int'而不是' int const'? –

回答

9

一個C和C++之間的差異是,在C++中const int對象是恆定,即,它可被用來形成常量表達式。在C中,另一方面,const int對象根本不是常量(更像是「不可更改的變量」)。

同時,C中文件範圍數組的數組大小必須是常量表達式,這就是爲什麼您的const int對象不起作用的原因。 (上面的意思是,順便說一句,你的代碼將完美地編譯爲C++,但不會編譯爲C.)

在定義命名常量的C語言中,您必須使用#define或enums。在你的具體情況下,它可以按如下方式完成:

#define NAMESIZE 40 
#define ADDRSIZE 80 

P.S.如果用本地數組替換文件範圍數組,則C代碼將按原樣編譯,即將const int對象作爲數組大小,因爲現代C(ANSI C99)支持局部範圍內的可變長度數組(VLA)。 (在這種情況下你的陣列將是VLA)。在較舊版本的C中(如ANSI C89/90),即使使用本地數組,代碼也不會編譯。

+0

感謝您的解釋 –

7

這些常量聲明在C中只是定義了一些只讀存儲器,它們不是真正的常量。直到運行時才能評估它們,這對於數組聲明來說太晚了。

+0

啊好吧我現在看到...謝謝 –

相關問題