我有很多编译标志,可以为不同的客户配置我的程序。例如:MODE_A_1
、MODE_A_2
、MODE_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_1
、MODE_A_2
、MODE_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)
,您可以将它们设置为整数版本号。。。