typedef struct _A
{
UINT8 length;
UINT8 data[];
}A;
这样在c里面写没问题
但是在c++里面会报错
warning C4200: nonstandard extension used : zero-sized array in struct/union
1> Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
请问为什么?怎么修改呢?
18 个解决方案
#1
搁一个正整数常量表达式在 [] 中就行了,比如 [1].
#2
呃 这个肯定行……但是完全不一样啊 我数组元素不确定呢
#3
数组长度必须在编译时确定
虽然动态数组已经出现在标准里很长时间,但一直没有普及,至少我不懂。但即使是动态数组,也必须在定义时给出数组长度,只是这个长度可以在运行时再确定而已。
在C里面,这样定义的“数组”实际上是指向结构体后面空间的指针,是一种巧妙的用法
在C++里面,不允许这样定义
虽然动态数组已经出现在标准里很长时间,但一直没有普及,至少我不懂。但即使是动态数组,也必须在定义时给出数组长度,只是这个长度可以在运行时再确定而已。
在C里面,这样定义的“数组”实际上是指向结构体后面空间的指针,是一种巧妙的用法
在C++里面,不允许这样定义
#4
数组元素不确定,为什么不尝试用指针呢?
typedef struct _A {
UINT8 length;
UINT8* data;
}A;
#5
UINT8 data[];
data 数组大小必须确定
数组元素不确定的话 可使用vector 容器吧
data 数组大小必须确定
数组元素不确定的话 可使用vector 容器吧
#6
恩 这样可以 还有一个问题是 别人跟我说data[]这样的定义是不占空间的 但是*data是不是有4字节的指针的控件啊?sizeof的时候会比data[]这种多出来4字节么?
#7
既然用的是C++,那就用标准库的容器吧,除非对速度有非常高的要求,否则都不需要使用数组。
#8
typedef struct _A
{
UINT8 length;
UINT8 data[0];
}A;
{
UINT8 length;
UINT8 data[0];
}A;
#9
+1 data[0]也可以。
#10
是的,你可以试试啊。3楼的解释很清楚,c里允许,但c++好像还不行。 用data[0]就可以,效果一样,也是不占空间。
#11
+1
#12
typedef struct _A
{
UINT8 length;
UINT8 data[ANYSIZE_ARRAY];
}A;
#13
//python源码asdl.h
typedef struct {
int size;
void *elements[1];
} asdl_seq; // Abstract Syntax Definition Language
//http://docs.python.org/devguide/compiler.html
//http://www.cs.princeton.edu/research/techreps/TR-554-97
在c语言中这样定义,空数组不占用任何空间,它只有偏移值,这样的方法是为了保留缓冲区和数据动态增长。
在C++中struct是特殊的class,编译器为其自动生成默认构造函数及拷贝构造函数,拷贝构造的过程中由于data本质是空的(在预编译的时候编译器根据data此可得偏移值,而在默认拷贝的过程中要拷贝该偏移值处的数据,而此处是空的,于是报错),c不会在预编译的时候考虑未预留的空间的值。
http://bbs.csdn.net/topics/120033131
#14
错误提示说的很清楚了:
nonstandard extension used : zero-sized array in struct/union
使用std::vector或std::array
使用std::vector或std::array
#15
这个不行
#16
怎么不行? 是你不会用吧.
#17
我在实习中,基本都是这么定义的。我结构体中都是使用的vector
#18
请问楼主最后怎么解决了这个问题?定义一个指针,用的时候再malloc不行吗?
#1
搁一个正整数常量表达式在 [] 中就行了,比如 [1].
#2
呃 这个肯定行……但是完全不一样啊 我数组元素不确定呢
#3
数组长度必须在编译时确定
虽然动态数组已经出现在标准里很长时间,但一直没有普及,至少我不懂。但即使是动态数组,也必须在定义时给出数组长度,只是这个长度可以在运行时再确定而已。
在C里面,这样定义的“数组”实际上是指向结构体后面空间的指针,是一种巧妙的用法
在C++里面,不允许这样定义
虽然动态数组已经出现在标准里很长时间,但一直没有普及,至少我不懂。但即使是动态数组,也必须在定义时给出数组长度,只是这个长度可以在运行时再确定而已。
在C里面,这样定义的“数组”实际上是指向结构体后面空间的指针,是一种巧妙的用法
在C++里面,不允许这样定义
#4
数组元素不确定,为什么不尝试用指针呢?
typedef struct _A {
UINT8 length;
UINT8* data;
}A;
#5
UINT8 data[];
data 数组大小必须确定
数组元素不确定的话 可使用vector 容器吧
data 数组大小必须确定
数组元素不确定的话 可使用vector 容器吧
#6
恩 这样可以 还有一个问题是 别人跟我说data[]这样的定义是不占空间的 但是*data是不是有4字节的指针的控件啊?sizeof的时候会比data[]这种多出来4字节么?
#7
既然用的是C++,那就用标准库的容器吧,除非对速度有非常高的要求,否则都不需要使用数组。
#8
typedef struct _A
{
UINT8 length;
UINT8 data[0];
}A;
{
UINT8 length;
UINT8 data[0];
}A;
#9
+1 data[0]也可以。
#10
是的,你可以试试啊。3楼的解释很清楚,c里允许,但c++好像还不行。 用data[0]就可以,效果一样,也是不占空间。
#11
+1
#12
typedef struct _A
{
UINT8 length;
UINT8 data[ANYSIZE_ARRAY];
}A;
#13
//python源码asdl.h
typedef struct {
int size;
void *elements[1];
} asdl_seq; // Abstract Syntax Definition Language
//http://docs.python.org/devguide/compiler.html
//http://www.cs.princeton.edu/research/techreps/TR-554-97
在c语言中这样定义,空数组不占用任何空间,它只有偏移值,这样的方法是为了保留缓冲区和数据动态增长。
在C++中struct是特殊的class,编译器为其自动生成默认构造函数及拷贝构造函数,拷贝构造的过程中由于data本质是空的(在预编译的时候编译器根据data此可得偏移值,而在默认拷贝的过程中要拷贝该偏移值处的数据,而此处是空的,于是报错),c不会在预编译的时候考虑未预留的空间的值。
http://bbs.csdn.net/topics/120033131
#14
错误提示说的很清楚了:
nonstandard extension used : zero-sized array in struct/union
使用std::vector或std::array
使用std::vector或std::array
#15
这个不行
#16
怎么不行? 是你不会用吧.
#17
我在实习中,基本都是这么定义的。我结构体中都是使用的vector
#18
请问楼主最后怎么解决了这个问题?定义一个指针,用的时候再malloc不行吗?