C++ 编译时已知数组大小:使用g++;但不适用于icpc
玩具代码非常简单:C++ 编译时已知数组大小:使用g++;但不适用于icpc,c++,arrays,gcc,struct,icc,C++,Arrays,Gcc,Struct,Icc,玩具代码非常简单: #include <stdio.h> #include <math.h> #define A 10 #define SIZE (int)(ceil(A / 2)) // needs computation but known at compile-time struct node { int keys[SIZE]; }; int main() { node a_node; for (int i = 0; i < SI
#include <stdio.h>
#include <math.h>
#define A 10
#define SIZE (int)(ceil(A / 2)) // needs computation but known at compile-time
struct node {
int keys[SIZE];
};
int main() {
node a_node;
for (int i = 0; i < SIZE; ++i) {
a_node.keys[i] = i;
printf("%d\n", a_node.keys[i]);
}
return 0;
}
它将通过gnu和英特尔编译器。非常有趣和有趣。我不确定我是否犯了任何我不知道的错误,是否有任何可能的线索
#define A 10
#define SIZE (int)(ceil(A / 2))
您的SIZE
不是编译时常量,因为ceil
是
中的浮点函数。因此编译器理解变量int-keys[SIZE]代码>作为(VLA)(其大小可能在运行时计算)。标准C++11或C++14没有VLA。但GCC接受它们作为该语言的一个补充。请注意,如果声明结构节点
,则键
不是变量,而是字段或成员
顺便说一句,如果将的定义的大小
替换为
#define SIZE ((A+1)/2)
它成为编译时常数(例如,C++中的代码> CONTXPRP</代码>),并具有与以前相同的值。
顺便说一句,您的代码不是真正的C++11,但看起来像C11代码。我建议安装更新版本的(2017年3月,使用,而不是一些旧的4.8)。然后使用
constepr
和std::array
VLA不能作为struct
-s中的字段出现。C99和C11尽可能具有结构的最后一个成员。C++11没有它们
可能,您的GCC编译器(以及
头)知道abs
可以扩展为\uuuuuu builtin\uabs
,这是由GCC编译器(而不是其他编译器)专门处理的(因此大小
扩展为(int)(ceil(10/2))
,特别是GCC,由于以下原因,它成为编译时间常数)
你应该理解C和C++是不同的语言。如果选择C++中的代码(至少在2017中任何过时的东西),你应该使用它的标准(并且你可能需要,因为这个大小是运行时计算的)。如果您选择在C中进行编码(至少),请考虑使用灵活的数组成员,并在堆中分配灵活的结构(适当使用<代码> MalOC 或朋友)。注意C++没有灵活的数组成员。< /P>
与标题相反,您的SIZE
不是(根据标准规范)“编译时已知数组大小”(而是在通过gcc
或g++
优化时变为一个)
使用堆分配(即C++中的代码< > STD::向量< /代码>,或用一个灵活的数组成员或一个数组指针指向C)的一个更好的理由是,在实践中,你将想要有一个更大的<代码> A/COD>(例如,代码>定义了100000个< /C>……)在上分配大型数据结构是不合理的(在当前的机器和操作系统上通常限制为一兆字节或几兆字节)
您的SIZE
不是编译时常量,因为ceil
是
中的浮点函数。因此编译器理解变量int-keys[SIZE]代码>作为(VLA)(其大小可能在运行时计算)。标准C++11或C++14没有VLA。但GCC接受它们作为该语言的一个补充。请注意,如果声明结构节点
,则键
不是变量,而是字段或成员
顺便说一句,如果将的定义的大小
替换为
#define SIZE ((A+1)/2)
它成为编译时常数(例如,C++中的代码> CONTXPRP</代码>),并具有与以前相同的值。
顺便说一句,您的代码不是真正的C++11,但看起来像C11代码。我建议安装更新版本的(2017年3月,使用,而不是一些旧的4.8)。然后使用
constepr
和std::array
VLA不能作为struct
-s中的字段出现。C99和C11尽可能具有结构的最后一个成员。C++11没有它们
可能,您的GCC编译器(以及
头)知道abs
可以扩展为\uuuuuu builtin\uabs
,这是由GCC编译器(而不是其他编译器)专门处理的(因此大小
扩展为(int)(ceil(10/2))
,特别是GCC,由于以下原因,它成为编译时间常数)
你应该理解C和C++是不同的语言。如果选择C++中的代码(至少在2017中任何过时的东西),你应该使用它的标准(并且你可能需要,因为这个大小是运行时计算的)。如果您选择在C中进行编码(至少),请考虑使用灵活的数组成员,并在堆中分配灵活的结构(适当使用<代码> MalOC 或朋友)。注意C++没有灵活的数组成员。< /P>
与标题相反,您的SIZE
不是(根据标准规范)“编译时已知数组大小”(而是在通过gcc
或g++
优化时变为一个)
使用堆分配(即C++中的代码< > STD::向量< /代码>,或用一个灵活的数组成员或一个数组指针指向C)的一个更好的理由是,在实践中,你将想要有一个更大的<代码> A/COD>(例如,代码>定义了100000个< /C>……)在上分配大型数据结构是不合理的(在当前的机器和操作系统上通常限制为一兆字节或几兆字节)。
这不太正确。VLA不能作为结构的成员出现。这里发生的事情是,GCC将ceil
视为constepr
,而Intel则不是。在GCC和Intel上都可以使用的版本在Intel上使用VLA,但这并不完全正确。VLA不能作为结构的成员出现。这里发生的事情是,GCC将ceil
视为constepr
,而Intel则不是。在GCC和英特尔上使用的版本都是在英特尔上使用VLA。你是用C还是C++来编码?c++
标记可疑。是否