#include <stdio.h>
int T;
int main()
{
struct T { double x; };
printf("%zu", sizeof(T));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我在C中运行此代码,结果是4,而在C++中它是8.
有人能解释为什么会有区别吗?
iBu*_*Bug 16
简短回答:因为它们不是同一个标识符,实际上.
在C中,结构名称和变量名称属于不同的名称空间,因此在C中,
sizeof(T) == sizeof(int) // global variable T
sizeof(struct T) == sizeof(struct T) // not the same namespace
Run Code Online (Sandbox Code Playgroud)
但是,在C++中,结构/类名称与变量位于同一名称空间中."最近"(最本地)名称是名称查找的结果,所以现在
sizeof(T) == sizeof(struct T) // structure T
sizeof(::T) == sizeof(int) // Note the scope resolution operator
Run Code Online (Sandbox Code Playgroud)
因此结果分别为4和8.
在C++中,你可以得到4 sizeof(::T)."双冒号"范围解析运算符强制编译器将其T作为外部命名空间中的名称,因此::T您需要的类型为int的变量.
在C中,(结构/联合/枚举)和(变量/函数/ typedef)具有单独的命名空间,因此您可以编写此命令而不必担心名称冲突.
struct T T;
Run Code Online (Sandbox Code Playgroud)
请注意括号,结构,联合和枚举共享一个命名空间,而其他三个共享另一个命名空间.
如果您尝试在C++中执行此操作,则会立即遇到问题.
我喜欢hacck的评论.他指出,基本原因是C和C++是不同的语言,尽管它们相似.