为什么C和C ++中相同标识符的大小不同?

#include  int T; int main() { struct T { double x; }; printf("%zu", sizeof(T)); return 0; } 

如果我在C中运行此代码,结果为4 ,而在C ++中则为8

有人能解释为什么会有区别吗?

简短回答:因为它们不是同一个标识符,实际上。

在C中,结构名称和变量名称属于不同的名称空间 ,因此在C中,

 sizeof(T) == sizeof(int) // global variable T sizeof(struct T) == sizeof(struct T) // not the same namespace 

但是,在C ++中,结构/类名称与变量位于同一名称空间中。 “最近”(最本地)名称是名称查找的结果,所以现在

 sizeof(T) == sizeof(struct T) // structure T sizeof(::T) == sizeof(int) // Note the scope resolution operator 

因此结果分别为4和8。

在C ++中,你可以使用sizeof(::T)获得4。 “双冒号”范围解析运算符强制编译器将T作为外部命名空间中的名称,因此::T是您想要的int类型的变量。


在C中,(结构/联合/枚举)和(变量/函数/类型定义)具有单独的名称空间,因此您可以编写它而不必担心名称冲突。

 struct TT; 

请注意括号,结构,联合和枚举共享一个命名空间,而其他三个共享另一个命名空间。

如果您尝试在C ++中执行此操作,则会立即遇到问题。


我喜欢hacck的评论 。 他指出,基本原因是C和C ++是不同的语言,尽管它们相似。

您得到的结果不同,因为C和C ++是不同的语言。

在C ++中,当您声明一个struct(一个特殊的类)时,

 struct T { double x; }; 

然后你可以用它作为

 T sobj; // sobj is an object of type T 

T是这里的一种类型。 而在C中, T不是类型,而是struct T

 struct T sobj; 

现在在C ++中使用sizeof(T)sizeof(struct T)在C中使用sizeof(struct T) ,它们将为您提供struct的大小。

在C中, struct T结构标记 。 Struct标记与变量和类型位于不同的名称空间中。 要获取C中的类型,您必须编写struct T

sizeof()需要一个类型或一个表达式,而struct标签则不是。 但是你有变量T 变量名是sizeof()的有效表达式。

但是在C ++中, struct T是一个类型名称,因为C ++中的结构本质上只是一个公共所有成员的类。 因此sizeof(T)与C ++中的struct类型匹配。


值得注意的是sizeof运算符有两种不同的语法情况:

sizeof unary-expression
sizeof (类型名称)

对于前者, sizeof只接受表达式,但不接受类型。 在后者的情况下,它不包括表达式或类型。 所以你写过sizeof T而不是sizeof (T) ,你会在C ++中得到一个编译错误,因为T就是一个类型而不是表达式。

我相信C指的是在C ++中编写struct T所需的struct T ,因为struct是一个公共类,它可以被称为T所以两者都只是采用他们所拥有的T的最本地定义。