为什么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
的最本地定义。