const int num = 16;
struct inputs{
double X1[num];
double X2[num];
};
給我一個錯誤:數組大小聲明差異對於C和C++
error: variably modified ‘X1’ at file scope
同樣是爲 'X2' 真。
但我記得上面的C++是好的,以上都是好的(我可能會誤認爲是C++)。
有人可以爲我澄清這一點嗎?
const int num = 16;
struct inputs{
double X1[num];
double X2[num];
};
給我一個錯誤:數組大小聲明差異對於C和C++
error: variably modified ‘X1’ at file scope
同樣是爲 'X2' 真。
但我記得上面的C++是好的,以上都是好的(我可能會誤認爲是C++)。
有人可以爲我澄清這一點嗎?
是的,有區別。在C中,const
變量仍然不被視爲真正的編譯時常量(正式地,它不被允許爲constant expression
的一部分),所以這是不允許的。但是,請注意,雖然C不要求編譯器允許,但標準確實允許實現接受其他形式的常量表達式,因此如果它選擇,它可以自由接受。
在C++中,const
變量被視爲常量,因此它是允許的。
有趣的是,大致當使用作爲函數參數傳遞的值的情況正好相反:允許用C
void f(int size) {
int array[size];
}
這是,但不是在C++。這是一個variably modified
陣列;你得到的錯誤信息基本上是試圖告訴你,這些只能在函數內部使用。
我可以指給你一個C FAQ: I don't understand why I can't use const values in initializers and array dimensions。
它基本上說的是num
不是一個真正的常量,它只是只讀的。要得到一個真正的常數,你需要一個#define num 16
。
也在同一頁面上:C在這方面不像C++。
不在結構中。你可以在本地範圍內完成。
你必須使用一個常數值。所以在C中,你必須在這方面使用#define
。對於C++來說,它會很好。
使用此來代替:
#define num 16
struct inputs{
double X1[num];
double X2[num];
};
錯誤..範圍內的'#define'? –
單詞的錯誤選擇,意味着方面。 –
這是更好的:) –
在C++中,編譯的時間常數可以被用作在數組聲明長度和const
變量(僅其中的一些)可以是編譯時間常數。這就是爲什麼它能用C++工作。
但是,C具有類似於可變長度數組的特性。這意味着您可以使用任何整數表達式(即使運行時計算)作爲數組長度,但只能用於局部變量。這就是爲什麼你的編譯器抱怨在文件範圍處「可變地修改」X1'「。
正如其他人所說的,C和C++對於常量整型表達式是不同的。
但是,您不必像其他人所建議的那樣使用宏來使代碼適用於兩者。如果你想用「範圍」來做,你可以用一個枚舉常量來實現。像
enum { num = 16 };
struct inputs {
double X1[num];
double X2[num];
};
將適用於這兩個,無論你是否把它放在文件或功能範圍。
在C中,你可以將一個數組的大小傳遞給一個函數?學到了 !謝謝! – Rich
@Rich:是的,但只有當你的編譯器符合C99(至少在這方面) - 這不包括在C89/90中(雖然它是一個相當常見的擴展,即使是較老的編譯器)。 –