c++ - 非局部变量在 C++ 中使用匿名类型警告

标签 c++ c gcc warnings

我正在编译一个 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 的库头文件的情况下修复它?

最佳答案

C++ 的设计期望实现将类型名称用作错位符号名称的一部分。 C 在设计时并未考虑到这种期望。

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

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

首选的修复方法是将 C 代码编译为 C,而不是 C++。然后将它与您的 C++ 程序的其余部分链接起来。当您包含来自 C++ 的 header 时,请执行以下操作:

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

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

关于c++ - 非局部变量在 C++ 中使用匿名类型警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16383099/

相关文章:

c - GCC -flto 和 inline 关键字

python - 通过 Boost Python 将 Python 函数转换为 C++,以用作回调

c - 在 C 中管理多个进程以完成相同的工作

c++ - 如何在 Windows (C++ WinApi) `SUBSYSTEM:WINDOWS` 下显示和输出到控制台 (cmd)

arrays - 如何丢弃用户输入中除 a-z && A-Z && 0-9 之外的所有字符以查找可能的回文

c++ - makefile 的问题

c++ - 带有 const ref initialise 的非常奇怪的输出

c++ - 不能将规范与 fmt 库混合

c++ - 在 std::list 中就地创建自定义类型对象

c++ - 如何修复我的快速排序实现?