0

我正在编译一个使用 GCC 4.7 的 C 库的 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定义的库头文件的情况下修复它?

4

1 回答 1

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。

于 2013-05-05T09:30:24.307 回答