我已经构建了两个应用程序,都运行良好。 使用GCC C编译器。目标:LPC40xx MCU。
问题: 这两个库的作者对同一寄存器使用了不同的值。 当我尝试编译时,会出现大量的“多个定义”。
示例:
file1.h: #define DEF1 1
file2.h: #define DEF1 0x0001
file1.c include file1.h (DEF1 = 1)
file2.c include file2.h (DEF1 = 0x0001)
即使从技术上讲它们具有相同的值,但链接器并不喜欢它。
我想要的是告诉编译器/链接器忽略多个定义。 file1.c包含带有“ #define DEF1 1”的file1.h,并且应忽略file2.h具有DEF1的另一个定义,但只需在它包含的文件中查找DEV1定义即可。
file1.c
- include file1.h
- #define DEV1 1
file2.c
- include file2.h
- #define DEV1 0x0001
我要搜索的是一种强制file1.c在包含的.h文件中使用#define的方法,而忽略其他.h文件中的#define。
这有可能吗?
答案 0 :(得分:1)
您有两个选择:
#undef DEV1
之间#include
该警告非常重要,因为否则,重写的标题可能是灾难性的。对于您而言,由于它们的值相同,所以不会造成问题。
答案 1 :(得分:0)
假设file1和file2是应该分开的单独模块,C中的标准做法是在#define的名称前加上逻辑单元的简短名称空间,例如:
#define FILE1_DEF1 1
您也应该对头文件中的函数名称执行此操作,以避免冲突。在SDL图形编程库中查看一个非常好的示例(我认为)。
如果file1和file2都是某个总体模块的子组件,则应将DEF1的定义抽象为file1.h和file2.h都可以包含的其他头文件。
答案 2 :(得分:0)
因此,常见的是sdk标头,通常,在定义符号之前,它们只会取消定义任何符号:
complex.h中的示例:
#undef complex
#define complex _Complex
#undef _Complex_I
/* Constant expression of type const float _Complex */
#define _Complex_I (__extension__ 1.0iF)
#undef I
#define I _Complex_I
这通常效果很好,但是如果您使用的名称冲突而工作方式不同,则可能需要更多的创造力。
答案 3 :(得分:-1)
编译-DDEV1=0x0001
时,可以将gcc
选项传递给file2.c
编译器。
那么您可能想用file1.h
这样的代码
#ifndef DEV1
#define DEV1 1
#endif
详细了解invoking GCC。另请阅读documentation of cpp
。
PS。我不确定您到底想实现什么。但是,我相信您确实希望在某些编译中传递一些-D
标志,并且您可能还需要#ifndef