- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 rlutil.h但是每次这些函数在多个 header 中使用时,我都会遇到关于 20-30 个变量的多个定义的编译器错误。 rlutil 是一个简单的头文件,用于在 linux 和 Windows 中为 C 和 C++ 中的终端着色。
变量是这样的
const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST = "\007";
还有类似的 typedef
typedef const char* RLUTIL_STRING_T;
我尝试添加自己的 C 守卫,但没有成功。我尝试将 .h 与我自己的 .h/.c 分层以使用 rlutil.h 函数创建新函数,但问题仍然存在。我试图使变量成为外部变量,但这是最糟糕的
我在 ubuntu 上用 gcc 构建它。我打算在家里用 MVSC2017 试试这个,但我认为行为是一样的。
有什么想法吗?
我可以提供更多信息。对不起我的英语我不是母语人士
非常感谢
最佳答案
问题是 header 的设置只是为了使其与 C++ 一起工作,其中 header rlutil.h
中定义的 const
值对于每个翻译都是私有(private)的单位 (TU) — 认为源文件加标题 — 包括标题。相比之下,在 C 中,它们是在包含 rlutil.h
的每个 TU 中定义的普通全局变量,从而导致多重定义问题。
没有简单的修复方法——除非从 C 切换到 C++ 被认为是微不足道的。 header 试图在 C 和 C++ 之间保持语言中立,但在这一点上失败了。再次证明 C 和 C++ 是不同的语言。
在 C 中,您需要编写如下代码:
extern const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST;
在 header 中,然后一个源文件将定义值:
const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST = "\007"; // James Bond!
或者,您可以考虑在 header 中使用 static
:
static const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST = "\007";
包含此 header 的每个 C 文件都将有其自己的已定义变量集合。在 C 语言中,您会收到有关未使用变量的编译器警告,这是不可取的。在 C++ 中,您可能会收到有关使用 static
而不是匿名 namespace 的警告。因此,尚不清楚这是一个好的解决方案。
如果你够勇敢,你可以阅读我对 How do I use extern
to share variables between files 的回答的末尾部分,但 header 可能不在您的控制范围内,您确实需要向代码的维护人员报告问题。 (如果您是维护者,请考虑其他问题的答案中概述的方案是否有帮助。)
关于C Guard 不能按预期与 rlutil.h 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46591356/
我正在尝试使用 rlutil.h但是每次这些函数在多个 header 中使用时,我都会遇到关于 20-30 个变量的多个定义的编译器错误。 rlutil 是一个简单的头文件,用于在 linux 和 W
我是一名优秀的程序员,十分优秀!