Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译时已知数组大小:使用g++;但不适用于icpc_C++_Arrays_Gcc_Struct_Icc - Fatal编程技术网

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++
标记可疑。是否