通配符风格的C预处理器技巧



我有很多编译标志,可以为不同的客户配置我的程序。例如:MODE_A_1MODE_A_2MODE_B_1。。。MODE_AB_54。。。

我真的想要一些预处理器的技巧,这将允许我这样的伪代码:

#ifdef MODE_A_.*

不必键入每个MODE_A_。。出现次数:

#if defined(MODE_A_1) && defined(MODE_A_2) && ...

如果可以应用正则表达式,那就更酷了。

与其使用宏名称,不如将宏名称设置为表示功能的位模式。例如

#define FEAT_VCORNERS        0x01
#define FEAT_VPANEL          0x02
#define FEAT_DOOR_FULL_PANEL 0x04

好的,所以它将你限制在32个单独的功能-这不是很多,但可能已经足够了

然后,您为每个客户定义他们的功能。如果图案重复也没关系

#define CUST_A (FEAT_VCORNERS)
#define CUST_B (FEAT_VCORNERS)
#define CUST_C (FEAT_VPANEL | FEAT_DOOR_FULL_PANEL)
#define CUST_D (FEAT_VCORNERS | FEAT_VPANEL)

在构建输入中,您可以定义-DCUST=CUST_D。在代码中,您只需要测试

#if CUST & FEAT_VCORNERS
...
#endif

我有很多编译标志,可以为不同的客户配置我的程序。例如:MODE_A_1MODE_A_2MODE_B_1。。。MODE_AB_54。。。

但是"MODE_ A_;不是客户。你在一个非常基本的层面上混淆了两件完全不同的事情。

如果你想要一个可以为不同客户独立启用/禁用的功能列表,可以使用之类的功能

#if defined(CUSTOMER_GUILLAUME)
#define ENABLE_FEATURE_A
#define ENABLE_FEATURE_1
#elif defined(CUSTOMER_USELESS)
#define ENABLE_FEATURE_B
#define ENABLE_FEATURE_2
// ...
#endif

然后代替

#if defined(MODE_A_1) && defined(MODE_A_2) && ...

你只需要使用

#if defined(ENABLE_FEATURE_A)

请注意,我只是在使用开/关功能标志。如果您需要更精细的控制,例如#if (FEATURE_C_VERSION > 123),您可以将它们设置为整数版本号。。。

相关内容

  • 没有找到相关文章

最新更新