C 和 C++ 之间不兼容;代码
给定的 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 位实现中给出 4 作为 C 的输出,而在 C++ 中代码
#include <iostream>
int x = 14;
size_t check()
{
struct x {};
return sizeof(x); // which x
}
int main()
{
std::cout<< check();
return 0;
}
输出 1。为什么会有这样的差异?
The given C code
#include <stdio.h>
int x = 14;
size_t check()
{
struct x {};
return sizeof(x); // which x
}
int main()
{
printf("%zu",check());
return 0;
}
gives 4 as output in C on my 32 bit implementation whereas in C++ the code
#include <iostream>
int x = 14;
size_t check()
{
struct x {};
return sizeof(x); // which x
}
int main()
{
std::cout<< check();
return 0;
}
outputs 1. Why such difference?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在 C++ 类声明中
struct x {};
将名称x
引入check
范围并隐藏x
(之前在文件范围内声明为int
)。您得到 1 作为输出,因为 空类的大小不能为零C++。在 C 中,结构体标记名称的内部作用域声明永远不会隐藏外部作用域中的对象或函数的名称。您需要使用标记名称
struct
来引用类型名称x
(结构)。但是,C 中不能有空结构 它违反了 struct 的语法约束(但是 gcc 支持它作为扩展)。In C++ class declaration
struct x {};
introduces the namex
into the scope ofcheck
and hidesx
(previously declared asint
at file scope). You get 1 as the output because size of empty class cannot be zero in C++.In C, an inner scope declaration of a struct tag name never hides the name of an object or function in an outer scope.You need to use the tag name
struct
to refer to the typenamex
(struct). However you can't have an empty struct in C as it violates the syntactical constraints on struct(however gcc supports it as an extension).C 代码给出全局变量“x”的大小,而 C++ 代码给出空结构的大小。
要获取 C 代码中 struct x 的大小,请使用 sizeof(struct x)
The C code is giving you the size of the global variable 'x', whereas the C++ code is giving the size of the empty struct.
To get the size of the struct x in the C code, use sizeof(struct x)
在 C 中,struct 标签位于单独的名称空间中,您必须使用 struct 关键字来访问其中的名称。这就是“typedef struct {} x”习惯用法在 C 中如此流行的原因——它本质上允许您将结构名称提升到全局命名空间。
相比之下,在 C++ 中,结构(以及所有其他名称)存在于声明周围的命名空间中,而不是像 C 中那样位于单独的结构标记命名空间中。正如
Saurabh 所说,在 C 中使用 sizeof(struct x) ,或使用
typedef struct {} x
让 sizeof(x) 像在 C++ 中一样工作的技巧。作为额外的好处,C++ 程序输出 1,因为具体类对象必须具有非零大小(因此不同的对象必须具有不同的地址),因此编译器使用匿名 char 值填充结构。
In C, struct tags live in a separate name space, and you have to use the struct keyword to access names in there. This is the reason that the "typedef struct {} x" idiom is so popular in C--it allows you to essentially promote struct names to the global namespace.
In C++, by contrast, structs (and all other names) live in the namespace surrounding the declaration, rather than a separate struct tag namespace as in C.
As Saurabh said, use sizeof(struct x) in C, or use the
typedef struct {} x
trick to get sizeof(x) to work as in C++.As an added bonus, the C++ program outputs 1 because concrete class objects must have nonzero size (so that different objects must have different addresses), so the compiler has padded the struct with an anonymous char value.