C 使用常量初始化多维数组
这种初始化是有效的C 使用常量初始化多维数组,c,C,这种初始化是有效的 int arr[3][4] = { {1,2,3,4}, {1,2,3,4}, {1,2,3,4} } ; 但这里的这个没有 const size_t row_size = 3; const size_t col_size = 4; int arr[row_size][col_size] = { {1,2,3,4},{1,2,3,4},{1,2,3,4}}; 这些代码是在C中,但是在将文件扩展名改为C++之后重新编译 它很好用。为什么会有这样的行为?这曾
int arr[3][4] = { {1,2,3,4}, {1,2,3,4}, {1,2,3,4} } ;
但这里的这个没有
const size_t row_size = 3;
const size_t col_size = 4;
int arr[row_size][col_size] = { {1,2,3,4},{1,2,3,4},{1,2,3,4}};
这些代码是在C中,但是在将文件扩展名改为C++之后重新编译
它很好用。为什么会有这样的行为?这曾经是C语言的一个问题,宏被用来解决这样的问题。但是在C++中,如果使用“const”关键字,编译器应该在编译时自动替换这些值,所以G++不会有任何问题。当使用g++编译时,该代码运行得非常好。可能您正试图用gcc编译它(我在gcc中得到了与预期相同的错误)。事实上,有一个
const
-变量并不意味着它在编译时是常量。例如,我可以
void f(int x) {
const int y = x;
int m[y]; // should that work?
}
它在旧的C++03中不起作用,因为编译器无法在编译时确定y
。虽然C++中很快就可以调用这个函数,但看起来你只需要一个简单的编译时间常数。只要说它也是静态的:
static const int size_t row_size = 3;
从现在开始,可以在编译时使用它。
你得到了什么错误?@ JojFiffsField:“可变大小的对象可能不被初始化”,你使用哪个编译器?“为什么这样的行为?”因为C和C++是不同的语言。(具体来说,他们对数组大小是否必须是常量以及哪种类型的表达式算作常量有不同的看法)不要期望任意代码从一个工作到另一个;选择一个语言并坚持它。真的,但是代码> const siZet n=42;< /Cord>是编译时常数。@ JuangopANZA不应该是<代码> conXPROP?那么@ JuangopaZa我不记得C++标准中的任何东西。也许,我应该再看一看。我想Co我只关心数组大小是否是一个常量表达式,这与编译时常量不一定是同一回事。我不确定细节,所以我不会发表我自己的答案。