C宏启用和禁用代码function

我之前使用过代码库,它有一个宏系统,用于启用和禁用代码段。 它看起来像下面这样:

#define IN_USE X #define NOT_IN_USE _ #if defined( WIN32 ) #define FEATURE_A IN_USE #define FEATURE_B IN_USE #define FEATURE_C NOT_IN_USE #elif defined( OSX ) #define FEATURE_A NOT_IN_USE #define FEATURE_B NOT_IN_USE #define FEATURE_C IN_USE #else #define FEATURE_A NOT_IN_USE #define FEATURE_B NOT_IN_USE #define FEATURE_C NOT_IN_USE #endif 

然后,function的代码如下所示:

 void DoFeatures() { #if USING( FEATURE_A ) // Feature A code... #endif #if USING( FEATURE_B ) // Feature B code... #endif #if USING( FEATURE_C ) // Feature C code... #endif #if USING( FEATURE_D ) // Compile error since FEATURE_D was never defined // Feature D code... #endif } 

我的问题(我不记得的部分)是如何定义’USING’宏,以便在function未被定义为’IN_USE’或’NOT_IN_USE’时出错? 如果您忘记包含正确的头文件,可能就是这种情况。

 #define USING( feature ) ((feature == IN_USE) ? 1 : ((feature == NOT_IN_USE) ? 0 : COMPILE_ERROR?)) 

您的示例已经达到了您想要的效果,因为如果未定义USING#if USING(x)将产生错误消息。 您在头文件中所需要的就像是

 #define IN_USE 1 #define NOT_IN_USE 0 #define USING(feature) feature 

如果你想确保你也因为做某事而得到错误

 #if FEATURE 

要么

 #if USING(UNDEFINED_MISPELED_FEETURE) 

然后你可以做,比方说,

 #define IN_USE == 1 #define NOT_IN_USE == 0 #define USING(feature) 1 feature 

但你不能防止这种滥用

 #ifdef FEATURE 

如果它没有被使用,就不要定义它

 #if defined( WIN32 ) #define FEATURE_A #define FEATURE_B #else if defined( OSX ) #define FEATURE_C #else #endif 

然后在你的代码中:

 void DoFeatures() { #ifdef FEATURE_A // Feature A code... #endif #ifdef FEATURE_B // Feature B code... #endif #ifdef FEATURE_C // Feature C code... #endif #ifdef FEATURE_D // Compile error since FEATURE_D was never defined // Feature D code... #endif } 

难道你不能只使用另一组#ifdef吗?

 #if defined(WIN32) #define FEATURE_A #define FEATURE_B #elif defined (OSX) #define FEATURE_C #endif // ... #if defined(FEATURE_A) do_a(); #endif 

等等

 #define IN_USE 1 //#define NOT_IN_USE _ //Not required #if defined( WIN32 ) #define FEATURE_A IN_USE #define FEATURE_B IN_USE #define FEATURE_C NOT_IN_USE #elif defined( OSX ) #define FEATURE_A NOT_IN_USE #define FEATURE_B NOT_IN_USE #define FEATURE_C IN_USE #else #define FEATURE_A NOT_IN_USE #define FEATURE_B NOT_IN_USE #define FEATURE_C NOT_IN_USE #endif #define USING( feature ) feature 

然后你的代码

这样的事怎么样?

 #define IN_USE 1 #define NOT_IN_USE 0 #if defined( WIN32 ) #define FEATURE_A IN_USE #define FEATURE_B IN_USE #define FEATURE_C NOT_IN_USE #elif defined( OSX ) #define FEATURE_A NOT_IN_USE #define FEATURE_B NOT_IN_USE #define FEATURE_C IN_USE #else #define FEATURE_A NOT_IN_USE #define FEATURE_B NOT_IN_USE #define FEATURE_C NOT_IN_USE #endif #define USING(f) ((f == IN_USE) ? 1 : (f == NOT_IN_USE) ? 0 : (f)) #include  void DoFeatures() { #if USING( FEATURE_A ) // Feature A code... printf("Feature A\n"); #endif #if USING( FEATURE_B ) // Feature B code... printf("Feature B\n"); #endif #if USING( FEATURE_C ) // Feature C code... printf("Feature C\n"); #endif #if defined( FEATURE_D ) // Compile error since FEATURE_D was never defined // Feature D code... printf("Feature D\n"); #else #error FEATURE_D not defined. #endif } int main(int argc, char **argv) { DoFeatures(); return 0; } 

对于编译错误,我不知道如何将它集成到宏中。 如果有人能给我们一些启示,我们将不胜感激。 :P

以下作品。 它会为FEATURE_D提供编译错误。 如果您注释掉FEATURE_D的代码,那么它将执行FEATURE_A和FEATURE_B的代码。 代码几乎是不言自明的。 您可以将它们放在if块中,而不是检查是否在DoFeatures函数中定义了FEATURE_D或其他内容。 这样,编译器将尝试执行代码块。 如果是1,则if块中的代码将被执行; 在0的情况下,它将不会被执行。 如果它从未定义,那么将得到编译错误。

 #include  #define IN_USE 1 #define NOT_IN_USE 0 #define FEATURE_A IN_USE #define FEATURE_B IN_USE #define FEATURE_C NOT_IN_USE void DoFeatures() { if(FEATURE_A){ // Feature A code... printf("Feature A\n"); } if(FEATURE_B){ // Feature B code... printf("Feature B\n"); } if(FEATURE_C){ // Feature C code... printf("Feature C\n"); } if(FEATURE_D) {// Compile error since FEATURE_D was never defined // Feature D code... printf("Feature D\n"); } } int main(int argc, char **argv) { DoFeatures(); return 0; }