Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法解决供应商引入的定义问题? 这样,我们所使用的供应商提供了一个库(主要是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++_C_C++11 - Fatal编程技术网

有没有办法解决供应商引入的定义问题? 这样,我们所使用的供应商提供了一个库(主要是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,带有一些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++,c,c++11,C++,C,C++11,在他们的书库深处的一个标题中。现在的问题是,一旦它们的库包含在简单的C++11代码中,例如: #include <iostream> #include <vendor/library.h> int main(void) { std::int32_t std_i = 0; return std_i; } #包括 #包括 内部主(空) { std::int32_t std_i=0; 返回std_i; } 立即出现编译器错误,(s_int32不在std::)中。

在他们的书库深处的一个标题中。现在的问题是,一旦它们的库包含在简单的C++11代码中,例如:

#include <iostream>

#include <vendor/library.h>

int main(void)
{
  std::int32_t std_i = 0;
  return std_i;
}
#包括
#包括
内部主(空)
{
std::int32_t std_i=0;
返回std_i;
}

立即出现编译器错误,(
s_int32
不在
std::
)中。所以问题是,除了对供应商唠叨这个问题之外,我们的代码中还有其他解决方法吗?(顺便说一句,我试过的东西,
#包括
在它们的头之前,没有运气;
外部“C”
包装,没有运气。头安装在
/usr/include/
中,所以我想也无法控制包含顺序…

您可以取消定义它们

#undef int64_t
#undef int32_t
#undef int16_t
#undef int8_t
他们使用的是
#ifndef
宏,这意味着:如果未定义,则值为

只需首先用您的值定义它:

#define int64_t (xx)
#define int32_t (xx)
#define int16_t (xx)
#define int8_t  (xx)

预处理器有一个聪明的特性:防止在替换宏时递归!因此,您可以这样定义它们:

#define int64_t int64_t
#define int32_t int32_t
#define int16_t int16_t
#define int8_t int8_t

之前包括供应商的标题。这样,它们就不会被重新定义(因为它们使用的是
#ifndef
),它们会在代码的其余部分保留它们的预期含义。

如果不查看文件中的其他内容,很难找到一个100%有效的解决方案

然而,您可以尝试的一个想法是以下内容(注意——我在我的编译器中含糊不清地尝试过这一点,但我不能保证它在任何其他编译器中都能工作)

创建一个包含其定义的文件,但作为typedefs:

typedef s_int64 int64_t;
...
然后,某些编译器允许您在命令行上指定要包含的文件,然后再指定其他文件。。。例如,gcc具有
-include
开关,因此您可以指定包含此文件

然后,也可以在命令行上,将定义映射到它们自己:

-Dint64_t=int64_t
甚至将定义放在上面的文件中:

#define int64_t int64_t
其结果是,从理论上讲,
#defines
不会干扰任何其他代码(它们不应该做任何事情——尽管我不确定是否可以使用递归扩展?)。当您创建了正确类型的
typedef
时,供应商代码应该仍然有效

将typedefs放入强制包含的文件中的原因是,您希望确保在其他任何操作之前包含它

然后,您应该提醒供应商更新其代码以使用
typedef
。你是客户,他们想卖给你一种产品


请记住所有理论。

不要在代码中包含此类标题。它们污染了它。不要使用供应商的代码。@DanielDaranas,如果必须使用他们的库来访问硬件,则不能使用此选项!:/您可以不使用标题而使用库。库由链接器包含,头由预处理器解析;只需复制标题,编辑它,包括本地副本。毕竟是C语言,不是Java@瓦克斯奎斯,对不起,但这是一个非常愚蠢的建议,所以我必须修补和维护供应商的头文件,因为他们改变了事情?真是浪费时间……我不是说你应该这么做,我是说这显然是可能的。Daniel Daranas提供了一个有效的观点;你说“这不是一个选项”提供了无效的理由,我提供了一个选项,证明你的理由是错误的;您显然不明白,您不能让代码同时依赖于供应商和可移植。您的问题主要是,接受供应商的解决方案并不能使您基本上同意其编程合同;围绕此联系人创建解决方案是一个你不同意它的迹象-但你使用它,而不是试图创建一个更好的。。。很可怕,但别无选择/@EliasVanOotegem他们不是。在普通的ol'C中,这是必要的邪恶。@Elias:这些肯定不伟大,这就是提问者对它们有问题的原因。@EliasVanOotegem:有人可能会说命名整型常量的宏也不伟大,你可以/应该使用枚举。宏就像对魔法的信仰,你可以用它来处理任何你还不能正确处理的事情;-)通过创建自己的头文件:
myVendor.h
,您可以减轻一点undef的痛苦,它看起来像:
#包括“vendor.h”#undef int64#t#undef int32#t等等。
问题是这些头文件应该是类型,而不是定义的常量。这就像在说
#ifndef int
。我怀疑这些自己的宏会比供应商定义的宏有用得多。那么
#define int64\t int64\t
呢?对于每种类型,情况也是如此?然后他们将被定义为他们自己,一切都应该工作……尽管定义一个保留名称在技术上是未定义的行为,
\define int64\t int64\t
几乎肯定会使一切工作正常。当然,假设您的实现确实提供了
int64\t
,并且您包含了“stdint.h”。实际上,您在编译行的定义上的观点可能会起到作用!我们的问题是,我们有几个旧版本的代码,其中包括供应商提供的这个库。我们不能重新发布那些旧版本,但是我们可以更改编译行,这个黑客可能暂时有效,并允许我们使用库的新版本..正如我在评论中提到的,在编译行中添加一系列
-D..
修复了编译器错误。这意味着我们的旧版本和任何新编译都可以正常工作。。。因此,我将接受这个答案……这里唯一的问题是,如果供应商的标题假定
int64\t
实际上是他们自己的
s\u int64
。根据
s_int64
的实际情况,在调用其库函数时,它可能最终无法映射到正确的类型。这可能只是一个名字,但你永远不知道:)@icabod如果他们真的这么想,他们应该