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

时间:2011-03-19 08:39:32

标签: 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;
}

在我的32位实现上给出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 个答案:

答案 0 :(得分:25)

在C ++类声明中,struct x {};将名称x引入check的范围,并隐藏x(之前在文件范围内声明为int)。你得到1作为输出因为size of empty class cannot be zero in C++

在C中,结构标记名称的内部范围声明永远不会隐藏外部范围中的对象或函数的名称。您需要使用标记名struct来引用类型名{{1} (struct)。但是你不能在C中有一个空结构it violates the syntactical constraints on struct(但是gcc支持它作为扩展名)。

答案 1 :(得分:7)

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

答案 2 :(得分:7)

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

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

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

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

答案 3 :(得分:0)

在C中,我认为您不能直接使用其名称来引用类型(即struct x)。您必须创建该类型的对象并在其上运行sizeof

在C ++中,sizeof应用于类型名称时返回该类型的任何对象的大小。