2011-11-03 74 views
5
const int num = 16; 
struct inputs{ 
     double X1[num]; 
     double X2[num]; 
}; 

給我一個錯誤:數組大小聲明差異對於C和C++

error: variably modified ‘X1’ at file scope

同樣是爲 'X2' 真。

但我記得上面的C++是好的,以上都是好的(我可能會誤認爲是C++)。

有人可以爲我澄清這一點嗎?

回答

3

是的,有區別。在C中,const變量仍然不被視爲真正的編譯時常量(正式地,它不被允許爲constant expression的一部分),所以這是不允許的。但是,請注意,雖然C不要求編譯器允許,但標準確實允許實現接受其他形式的常量表達式,因此如果它選擇,它可以自由接受。

在C++中,const變量被視爲常量,因此它是允許的。

有趣的是,大致當使用作爲函數參數傳遞的值的情況正好相反:允許用C

void f(int size) { 
    int array[size]; 
} 

是,但不是在C++。這是一個variably modified陣列;你得到的錯誤信息基本上是試圖告訴你,這些只能在函數內部使用。

+0

在C中,你可以將一個數組的大小傳遞給一個函數?學到了 !謝謝! – Rich

+0

@Rich:是的,但只有當你的編譯器符合C99(至少在這方面) - 這不包括在C89/90中(雖然它是一個相當常見的擴展,即使是較老的編譯器)。 –

0

不在結構中。你可以在本地範圍內完成。

+0

即使是C?根據其他答案,C不可能C也許可以嗎? – Rich

+3

僅適用於C99,不適用於C89。 –

+0

我相信亞當,因爲我不記得確切的標準。他的版本聽起來似乎合理。 –

0

你必須使用一個常數值。所以在C中,你必須在這方面使用#define。對於C++來說,它會很好。

使用此來代替:

#define num 16 
struct inputs{ 
    double X1[num]; 
    double X2[num]; 
}; 
+0

錯誤..範圍內的'#define'? –

+0

單詞的錯誤選擇,意味着方面。 –

+0

這是更好的:) –

0

在C++中,編譯的時間常數可以被用作在數組聲明長度和const變量(僅其中的一些)可以是編譯時間常數。這就是爲什麼它能用C++工作。

但是,C具有類似於可變長度數組的特性。這意味着您可以使用任何整數表達式(即使運行時計算)作爲數組長度,但只能用於局部變量。這就是爲什麼你的編譯器抱怨在文件範圍處「可變地修改」X1'「。

0

正如其他人所說的,C和C++對於常量整型表達式是不同的。

但是,您不必像其他人所建議的那樣使用宏來使代碼適用於兩者。如果你想用「範圍」來做,你可以用一個枚舉常量來實現。像

enum { num = 16 }; 
struct inputs { 
    double X1[num]; 
    double X2[num]; 
}; 

將適用於這兩個,無論你是否把它放在文件或功能範圍。