【发布时间】:2013-10-23 01:09:26
【问题描述】:
因此,我们使用的供应商提供了一个库(主要用于 C,具有一些 C++ 支持),它执行以下操作:
#ifndef int64_t
#define int64_t s_int64
#endif
#ifndef int32_t
#define int32_t s_int32
#endif
#ifndef int16_t
#define int16_t s_int16
#endif
#ifndef int8_t
#define int8_t s_int8
#endif
在他们图书馆深处的一个标题中。现在的问题是,一旦他们的库包含在简单的 C++11 代码中,例如:
#include <iostream>
#include <vendor/library.h>
int main(void)
{
std::int32_t std_i = 0;
return std_i;
}
立即出现编译器错误,(s_int32 不在std:: 中)。所以问题是,除了唠叨供应商来解决这个问题,有没有办法在我们的代码中解决这个问题? (顺便说一句。我尝试过的东西,#include <cstdint> before 他们的标题,没有运气;extern "C" 包装器,没有运气。标题安装在/usr/include/ 所以无法控制包含顺序我也猜一猜……)
【问题讨论】:
-
不要在代码中包含此类标头。他们污染它。不要使用供应商的代码。
-
@DanielDaranas,如果他们的库必须用于访问硬件,这不是一个选项! ://
-
您可以在不使用标题的情况下使用该库。库由链接器包含,头由预处理器解析;只需复制标题,编辑它,包括本地副本。毕竟是 C,而不是 Java!
-
@vaxquis,对不起,但这是一个非常愚蠢的建议,所以我必须在供应商头文件发生变化时修补和维护它们?真是浪费时间……
-
我不是说你应该这样做,我说这显然是可能。 Daniel Daranas 提供了一个有效的观点;你说“这不是一个选项”提供了无效的理由,我提供了一个选项,证明你的理由是错误的;您显然不明白您不能同时使您的代码依赖于供应商和可移植。您的问题主要是您没有通过接受供应商的解决方案来获得它,您基本上同意其编程合同;围绕此联系人创建解决方法是您不同意它的标志 - 但是您使用它而不是尝试创建一个更好的解决方法。