我试图使用rlutil.h但每次在多个头中使用这些函数时,我都会遇到关于20-30个变量的多个定义的编译器错误RLUTIL是Linux和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一起尝试,但我认为行为会是一样的。
知道吗?
我可以提供更多的信息。
对不起,我的英语不是母语
非常感谢

最佳答案

问题是,头只被设置为它与C++一起工作,其中在页眉const中定义的rlutil.h值对于每个翻译单元(TU)是私有的-思考源文件加头(包括头)。相比之下,在C中,它们是每个TU中定义的正常全局变量,包括rlutil.h,这导致了多个定义问题。
没有一个简单的修复——除非从C切换到C++被认为是微不足道的。报头试图在C和C++之间保持语言中立,但在这个计数上失败。再次证明,C和C++是不同的语言。
在C语言中,需要有如下代码:

extern const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST;

在头文件中,然后一个源文件将定义值:
const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST = "\007";  // James Bond!

或者,可以考虑在标题中使用static
static const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST = "\007";

包含此头的每个C文件都有自己的定义变量集合在C语言中,编译器会对未使用的变量发出警告,这是不可取的在C++中,您可能会得到关于使用static而不是匿名命名空间的警告。因此,目前尚不清楚这是否是一个好的解决方案。
如果你很勇敢,你可以阅读我对How do I use extern to share variables between files的回答的结尾,但标题可能不在你的控制范围内,你真的需要向代码的维护人员报告问题(如果您是维护者,那么考虑一个方案(如对另一个问题的回答中概述的方案)是否有帮助。)

关于c - C Guard无法正常使用rlutil.h,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46591356/

10-11 23:07
查看更多