C Guard 无法按预期使用 rlutil.h

C Guard not work as intended with rlutil.h

我正在尝试使用 rlutil.h 但每次这些函数被用于多个 header 我遇到关于 20-30 个变量的多重定义的编译器错误。 rlutil 是一个简单的 header 颜色终端 linux 和 windows 在 C 和 C++ 中。

变量是这样的

const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST = "[=11=]7";

还有类似的 typedef

typedef const char* RLUTIL_STRING_T;

我尝试添加自己的 C 守卫,但没有成功。 我尝试将 .h 与我自己的 .h/.c 分层,以使用 rlutil.h 函数创建新函数,但问题仍然存在。 我试图使变量成为外部变量,但这是最糟糕的

我正在 ubuntu 上使用 gcc 构建它。 我打算在家里用 MVSC2017 试试这个,但我认为行为是一样的。

有什么想法吗?

我可以提供更多信息。 抱歉我的英语不是母语

非常感谢

问题是 header 仅设置为与 C++ 一起工作,其中 header rlutil.h 中定义的 const 值是私有的每个翻译单元 (TU) — 认为源文件加上 headers — 包括 header。相比之下,在 C 中,它们是在包含 rlutil.h 的每个 TU 中定义的普通全局变量,导致多重定义问题。

没有简单的修复方法 — 除非从 C 切换到 C++ 被认为是微不足道的。 header 试图成为 C 和 C++ 之间的 language-neutral,但在这一点上它失败了。再次证明C和C++是不同的语言

在 C 中,您需要有如下代码:

extern const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST;

在 header 中,然后一个源文件将定义值:

const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST = "[=11=]7";  // James Bond!

或者,您可以考虑在 header:

中使用 static
static const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST = "[=12=]7";

包含此 header 的每个 C 文件都有自己的 collection 定义变量。在 C 语言中,您会收到有关未使用变量的编译器警告,这是不可取的。在 C++ 中,您可能会收到有关使用 static 而不是匿名名称空间的警告。因此,尚不清楚这是一个好的解决方案。

如果你够勇敢,你可以阅读我对 How do I use extern to share variables between files 的回答的尾部,但是 header 可能不在你的控制范围内,你真的需要向代码的维护者。 (如果您是维护者,请考虑其他问题的答案中概述的方案是否有帮助。)