C项目 - 两个库对不同类型使用相同的typedef标识符

时间:2018-01-17 16:27:30

标签: c typedef

我正在使用MODBUS2 lib进行项目,我想将FatFs lib添加到它以与SD卡连接。两个库分别对SHORTshort使用标识符int,编译器抛出此错误:

#258 invalid redeclaration of type name "SHORT" 

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:7)

您需要重新构建项目,使得您的库的翻译单元不必包含来自两个库的标题(翻译单元是C文件的奇特名称)。

一种方法是围绕MODBUS2和FatFs功能编写自己的瘦“包装”函数。每个包装器必须包含它包装的库的头文件,因此不会发生编译时冲突。然后你的库的主模块将编程到你的“包装器”,根本不包括MODBUS2或FatFs标头。

答案 1 :(得分:3)

假设库1有

typedef int SHORT;

和图书馆2有

typedef short SHORT;

假设您有以下代码:

#include "lib1.h"
#include "lib2.h"

您可以像这样修复编译错误:

#define SHORT LIB1_SHORT
#include "lib1.h"
#undef SHORT
#define SHORT LIB2_SHORT
#include "lib2.h"
#undef SHORT

如果这样做,您应该对代码中的所有#include指令始终如一地执行此操作。如果你没有太多#include s,这不是太乏味。

如果您不想一直记住这些规则,请将#define#undef作为所有有问题的库标题中的第一个和最后一个。

答案 2 :(得分:1)

使用那些没有任何前缀的SHORT typedef的库设计不合理,因为C中没有名称空间,因此它们会严重限制用户。好的,但我们必须忍受这一点。

如果typedef定义了相同的类型,那么就可以重复:

typedef int SHORT;
typedef int SHORT;

只要定义相同的基本类型,就可以多次使用。但这里的类型不同,所以这就是问题。

一个hack就是在所有FatFs库包含/来源上使用“仅限单词”替换,例如将SHORT替换为FF_SHORT

现在您可以包含两个库而不会发生任何冲突。

  • 主要优势:无需更多更改或包装(如​​其他优秀的答案所示):快速&脏。
  • 主要缺点:必须在每次升级库接口时完成。