C/C++中替代 #define hell 的工具或方法

9
在我们的C/C++项目中,我们使用一个包含了1000多行#ifdef和#define的配置头文件。
#if (defined(HW_1) || defined(SOME_TECHNOLOGY_SUPPORTED)) && defined(OTHER_TECHNOLOGY_SUPPORTED)
 #define SOME_FEATURE_AVAILABLE
#endif

在我们的构建配置中,我们预定义了一些宏定义,并传递给编译器。这会导致在我们的配置头文件中出现不同的宏定义(例如SOME_FEATURE_AVEILABLE)。
由于我们的配置头文件非常大,所以有点乱。
是否有任何替代方法来避免这种#define混乱?
或者是否有任何工具可帮助查看哪种情况下设置了哪些宏定义。
由于我们正在开发嵌入式固件,因此无法通过运行时if来替换条件编译。

2
你在哪个系统上编译?为哪个操作系统?查找 autoconfautotools.... - Basile Starynkevitch
2
如果你坚持使用ANSI C89和ISO C++ 98,那么你就不需要它们中的任何一个。 - user529758
4
我会建议您寻找 cmake 工具,特别是其中的 configure_file 命令。 - arne
1
你确定在使用 #define 而不是运行时条件语句时,你没有在某些情况下过早地进行优化吗? - user2656151
@H2CO3:如果你仅使用ANSI C89(同ISO C90)和ISO C++98来编程,那很好 - 但是你将不能使用很多特定于系统的东西。例如,所有的POSIX都将无法使用。 - Keith Thompson
显示剩余6条评论
2个回答

1

我更喜欢“桥接”模式而不是基于策略的设计:它可以在没有模板或多重继承的情况下实现相同的目标。 - Michael
我猜桥接会产生一些运行时开销(?)。基于策略的设计(使用模板)则不会有这个问题。多重继承在这里不会引起问题,因为您不会将对象作为基类对象处理(不会以多态方式对待它们)。 - JohnB

1

如果您所有的#define都在一个配置文件中,可以尝试进行预处理器编译,然后找到所有定义的宏。例如:

$ gcc -DFEATURE1 -DFEATURE2 -E configuration.h | grep '#define'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接