我正在尝试使用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
在文件之间共享变量的答案的末尾,但标题可能不在你的控制范围内,你真的需要向代码的维护人员报告问题。(如果你是维护者,那么想想其他问题的答案中列出的方案是否会有所帮助。)