C 和 C++ 之间不兼容;代码

发布于 2024-10-22 21:40:03 字数 472 浏览 7 评论 0原文

给定的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

流云如水 2024-10-29 21:40:03

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

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

In C++ class declaration struct x {}; introduces the name x into the scope of check and hides x (previously declared as int 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 typename x (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).

守护在此方 2024-10-29 21:40:03

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)

じ违心 2024-10-29 21:40:03

在 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文