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

dev*_*ahm 4 c c++ name-lookup

#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++是不同的语言,尽管它们相似.