我正在使用MODBUS2 lib进行项目,我想将FatFs lib添加到它以与SD卡连接。两个库分别对SHORT
和short
使用标识符int
,编译器抛出此错误:
#258 invalid redeclaration of type name "SHORT"
我该如何解决这个问题?
答案 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
。
现在您可以包含两个库而不会发生任何冲突。