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

Moh*_*lar 17 c c++ incompatibility

给定的C代码

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

在我的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;
}
Run Code Online (Sandbox Code Playgroud)

输出1.为何如此差异?

Pra*_*rav 25

在C++类声明中,struct x {};将名称x引入范围check和隐藏x(先前声明为int文件范围).输出为1,因为在C++中,空类的大小不能为零.

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

  • +1,但也许应该强调一个事实,即在C++`struct x`中只隐藏变量,因为`x`在外部范围内声明.如果他们被宣布在相同的范围内,他们将愉快地生活在一起*和*`sizeof`的行为将与C相同. (3认同)

Sau*_*nda 7

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


Dre*_*all 7

在C中,struct标签位于单独的名称空间中,您必须使用struct关键字来访问其中的名称.这就是"typedef struct {} x"成语在C中非常流行的原因 - 它允许您将结构名称提升到全局名称空间.

相反,在C++中,结构(以及所有其他名称)存在于声明周围的命名空间中,而不是像C中那样单独的结构标记命名空间.

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

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