2013-05-05 130 views
0

我在编译一个C++应用程序,它使用C库和GCC 4.7。非局部变量在C++中使用匿名类型警告

当我编译,我收到以下警告:

warning: non-local variable ‘const ptg_t param’ uses anonymous type 
warning: ‘typedef const struct<anonymous> ptg_t’ does not refer to the unqualified type, so it is not used for linkage 

C++为什么把它伪装成警告,其中c不? 有没有一种方法可以解决它,而无需更改定义了ptg_t param的库头文件?

+1

由于C++和C是具有不同规则的不同语言? – chris 2013-05-05 09:21:27

回答

3

C++的设计期望实现将使用类型名称作为损坏的符号名称的一部分。 C的设计并不符合这种期望。

这是因为C没有函数重载,而C++却没有。在C++中,可以使用不同的实体具有相同的名称,因此需要进行名称修改。

所以在C++中,涉及匿名类型的外部属于异常。

首选的方法是将C代码编译为C,而不是C++。然后将它与其他C++程序链接起来。当包括从C++头,做到这一点,如:

extern "C" { 
    #include "headername.h" 
} 

这值得重复:不编译C代码作为C++。 C不是C++的子集,而且还有一些有效的C程序,它们也是有效的C++,但它们在C++中具有与C中不同的所需行为。C++很容易从C移植到C,但它并不完全与C向后兼容。

+0

我试过用extern的建议,但警告仍在这里。 – stdcall 2013-05-05 09:36:02

+0

@Mellowcandle:奇怪。一旦你遵循我的建议,编译为C++的唯一东西就是头文件。如果在头文件中定义了这个extern对象,那么该库存在一些严重错误,因为这意味着如果同一个程序中的多个TU都使用该库,那么将会有多个对象定义(这是一个错误) 。如果是这种情况,那么你可能需要修复库。 – 2013-05-05 09:47:32

+0

或者,如果你真的无法修改它,尽管有源代码,你可以在C中为它编写一个包装器,公开提供相同接口但删除了不友好对象的新头文件。 – 2013-05-05 09:50:49