可以使用多个#define吗?

时间:2018-12-11 16:43:16

标签: c gcc cortex-m

我已经构建了两个应用程序,都运行良好。 使用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。

这有可能吗?

4 个答案:

答案 0 :(得分:1)

您有两个选择:

  1. 正如@tadman所指出的,您可以在#undef DEV1之间#include
  2. 编辑源代码

该警告非常重要,因为否则,重写的标题可能是灾难性的。对于您而言,由于它们的值相同,所以不会造成问题。

答案 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