17

给定的 C 代码

#include <stdio.h>
int x = 14; 
size_t check()
{
   struct x {};
   return sizeof(x); // which x
}
int main()
{
    printf("%zu",check()); 
    return 0;
}

在我的 32 位实现中,在 C 中给出 4 作为输出,而在 C++ 中,代码

#include <iostream>
int x = 14;    
size_t check()
{
   struct x {};
   return sizeof(x); // which x    
}
int main()
{
    std::cout<< check(); 
    return 0;
}

输出 1. 为什么会有这样的差异?

4

3 回答 3

25

在 C++ 类声明struct x {};中,将名称x引入check并隐藏x(之前声明为int在文件范围内)。您得到 1 作为输出,因为C++ 中空类的大小不能为零

在 C 中,结构标记名称的内部范围声明从不隐藏外部范围中的对象或函数的名称。您需要使用标记名称struct来引用类型名称x(结构)。但是,您不能在 C 中使用空结构,因为它违反了 struct 的语法约束(但是 gcc 支持它作为扩展)。

于 2011-03-19T08:43:37.480 回答
8

C 代码给出了全局变量“x”的大小,而 C++ 代码给出了空结构的大小。要在 C 代码中获取 struct x 的大小,请使用 sizeof(struct x)

于 2011-03-19T08:42:59.053 回答
7

在 C 中,结构标记存在于单独的名称空间中,您必须使用 struct 关键字来访问其中的名称。这就是“typedef struct {} x”习语在 C 中如此流行的原因——它允许您从本质上将结构名称提升到全局命名空间。

相比之下,在 C++ 中,结构(和所有其他名称)位于声明周围的命名空间中,而不是像 C 中那样单独的结构标记命名空间。

正如 Saurabh 所说,在 C 中使用 sizeof(struct x),或者使用typedef struct {} x技巧让 sizeof(x) 像在 C++ 中一样工作。

作为一个额外的好处,C++ 程序输出 1 因为具体的类对象必须具有非零大小(因此不同的对象必须有不同的地址),所以编译器已经用匿名 char 值填充了结构。

于 2011-03-19T08:49:33.620 回答