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

时间:2017-11-17 09:39:23

标签: c++ c name-lookup

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

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

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

4 个答案:

答案 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) namename 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的本地定义。