C Guard无法与rlutil.h一起正常工作



我正在尝试使用rlutil.h,但每次在多个标头中使用这些函数时,我都会在20-30个变量的多个定义方面出现编译器错误。rlutil在linux中是一个简单的头到彩色终端,在C和C++中是windows。

变量有点像

const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST = "07";

和typedef类似的

typedef const char* RLUTIL_STRING_T;

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

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

知道吗?

我可以提供更多信息。对不起,我的英语不是母语

非常感谢

问题是,标头的设置只是为了让它与C++一起工作,其中标头rlutil.h中定义的const值对包括标头的每个翻译单元(TU)都是私有的,比如源文件加标头。相反,在C中,它们是在包括rlutil.h的每个TU中定义的正常全局变量,这导致了多重定义问题。

除非从C转换到C++被认为是微不足道的,否则没有一个微不足道的解决方案。标头试图在C和C++之间保持语言中立,但在这个计数上失败了。再次证明C和C++是不同的语言。

在C中,你需要有这样的代码:

extern const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST;

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

const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST = "07";  // James Bond!

或者,您可以考虑在标题中使用static

static const RLUTIL_STRING_T ANSI_CONSOLE_TITLE_POST = "07";

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

如果你很勇敢,你可以阅读我关于如何使用extern在文件之间共享变量的答案的末尾,但标题可能不在你的控制范围内,你真的需要向代码的维护人员报告问题。(如果你是维护者,那么想想其他问题的答案中列出的方案是否会有所帮助。)