Lin*_*ios 7 c++ null sizeof void
我正在尝试声明一个占用零字节的C++变量.它在一个联合中,我以int [0]的类型开始.我不知道这是否实际上是零字节(虽然sizeof(int [0])是0).我需要一种更好的方法来声明一个0字节类型,并希望可以将其类型化为nullType或emptyType.变量在一个联合中,所以无论如何最终都会保留内存.我尝试了无效的机会,但是C++抱怨道.我正在使用Ubuntu 10.10,包含当前版本的内核,以及最新的GCC.这是联盟:
union RandomArgumentTypesFirst
{
uint uintVal;
nullType nullVal;
}
Run Code Online (Sandbox Code Playgroud)
这是typedef:
typedef int[0] nullType;
Run Code Online (Sandbox Code Playgroud)
编译器对typedef说了这个:
error: variable or field ‘nullVal’ declared voidmake[2]:
Run Code Online (Sandbox Code Playgroud)
当我输入时int[0],它有效.有什么建议?
编辑:正如@fefe在评论中所说,int[0]可能由编译器作为扩展提供.GCC的网站说默认情况下编译器有很多扩展.
您无法在C++中实例化任何占用零字节的数据类型.标准规定了一个空类,例如:
class Empty {};
Run Code Online (Sandbox Code Playgroud)
......将导致以下情况属实:
Empty emp;
assert( sizeof(emp) != 0 );
Run Code Online (Sandbox Code Playgroud)
这样做的原因是您可以获取对象的地址.
编辑:我原来说sizeof会1,但每@Als'的评论,我发现在标准的相关通道,它的确只是非零:
[课程]§9/ 3
类类型的完整对象和成员子对象应具有非零大小
该标准明确禁止存在大小为0的类型的实例,原因是如果一个对象的大小为0,那么两个不同的对象可以位于完全相同的地址.例如,空结构将被强制为大小> 0以符合该要求,即使用作不同类型的基础时,编译器也可以使其大小为== 0.
你想用空课做什么?
typedef拼写错误:
typedef int nullType[0];
Run Code Online (Sandbox Code Playgroud)
正如其他人所指出的那样,你不能有一个大小为0的对象; 但是,编译器可以(并经常)提供Empty Base Class优化.