gpt4 book ai didi

C Guard 不能按预期与 rlutil.h 一起工作

转载 作者:太空宇宙 更新时间:2023-11-03 23:40:49 28 4
gpt4 key购买 nike

我正在尝试使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com