可以有一个占用0个字节的C++类型

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的网站说默认情况下编译器有很多扩展.

Joh*_*ing 6

您无法在C++中实例化任何占用零字节的数据类型.标准规定了一个空类,例如:

class Empty {};
Run Code Online (Sandbox Code Playgroud)

......将导致以下情况属实:

Empty emp;
assert( sizeof(emp) != 0 );
Run Code Online (Sandbox Code Playgroud)

这样做的原因是您可以获取对象的地址.

编辑:我原来说sizeof1,但每@Als'的评论,我发现在标准的相关通道,它的确只是非零:

[课程]§9/ 3

类类型的完整对象和成员子对象应具有非零大小

  • 标准仅规定空类的大小应为非零. (2认同)

Dav*_*eas 6

该标准明确禁止存在大小为0的类型的实例,原因是如果一个对象的大小为0,那么两个不同的对象可以位于完全相同的地址.例如,空结构将被强制为大小> 0以符合该要求,即使用作不同类型的基础时,编译器也可以使其大小为== 0.

你想用空课做什么?


seh*_*ehe 5

typedef拼写错误:

typedef int nullType[0];
Run Code Online (Sandbox Code Playgroud)

正如其他人所指出的那样,你不能有一个大小为0的对象; 但是,编译器可以(并经常)提供Empty Base Class优化.