#include <stdio.h>
int T;
int main()
{
struct T { double x; };
printf("%zu", sizeof(T));
return 0;
}
如果我在C中运行此代码,结果为4
,而在C ++中则为8
。
有人可以解释为什么会有区别吗?
答案 0 :(得分:16)
简答:因为它们实际上并不是相同的标识符。
在C中,结构名称和变量名称属于different namespaces,因此在C中,
sizeof(T) == sizeof(int) // global variable T
sizeof(struct T) == sizeof(struct T) // not the same namespace
但是,在C ++中,结构/类名称与变量一样进入相同的名称空间。 The "nearest" (most local) name是name lookup的结果,现在是
sizeof(T) == sizeof(struct T) // structure T
sizeof(::T) == sizeof(int) // Note the scope resolution operator
因此结果分别为4和8。
在C ++中,sizeof(::T)
可以得到4。 &#34;双冒号&#34;范围解析运算符强制编译器将T
作为外部命名空间中的名称,因此::T
是您想要的int类型的变量。
在C中,(结构/联合/枚举)和(变量/函数/ typedef)具有单独的命名空间,因此您可以编写此命令而不必担心名称冲突。
struct T T;
请注意括号,结构,联合和枚举共享一个命名空间,而其他三个共享另一个命名空间。
如果您尝试在C ++中执行此操作,则会立即遇到问题。
我喜欢hacck's comment。他指出,基本原因是C和C ++是不同的语言,尽管它们相似。
答案 1 :(得分:4)
您得到的结果不同,因为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的大小。
答案 2 :(得分:3)
在C中,T
中的struct T
是结构标记。 Struct标记与变量和类型位于不同的名称空间中。要获得C中的类型,您必须编写struct T
。
sizeof()
要求类型或表达式,而struct标记既不是。但是你有变量T
。变量名是sizeof()
中的有效表达式。
但是在C ++中,T
中的struct T
是一个类型名称,因为C ++中的结构本质上只是一个公共所有成员的类。因此sizeof(T)
匹配C ++中的结构类型。
值得注意的是sizeof
运算符有两种不同的语法情况:
sizeof
一元表达
sizeof
(类型名称)
如果是前者,sizeof
只接受表达式,但不接受类型。在后者的情况下,它不包括表达式或类型。所以你写过sizeof T
而不是sizeof (T)
,你会在C ++中遇到编译器错误,因为T
将是一个类型而不是表达式。
答案 3 :(得分:2)
我相信C在C ++中引用你需要编写struct T
的结构,因为struct是一个公共类,它可以被称为T
所以两者都只是采用他们所拥有的最T
的本地定义。