2013-10-03 50 views
2

因此,我有一段代码,如果它处于调试模式,它将访问一个DLL名称空间函数,并且如果它在发布中,我想注释掉它。宏以防止代码处理

#ifdef DEBUG 
     #define (DEBUG_CODE) abcd:: 
#else 
     #define (DEBUG_CODE) <Condition to skip processing> 


     if (some condition) 
       (DEBUG_CODE) func_name(); 

虽然我想了#else定义一个评论,我想你不能这样做,因为它们是由编译器代码的任何处理前跳过,或进行预处理..

如果这是正确的,那么请告诉我一种跳过(DEBUG_CODE) func_name();的处理的方法。有很多地方使用它,我不想在任何地方添加if(DEBUG)

编辑

命名空间DLL有不返回任何东西,以及其预期返回值的函数,以及可能被分配到一个enum功能。

abcd::func_name(); 
and 
    int rs = abcd::func_name_2(); 
and 
    enum XYZ{ var1 = 0; var2}; 
    XYZ PQR = abcd::func_name3(); //This Enum will prevent me from defining some kind 
            // 0; as a `#define` 

So..multiple场景..

感谢您的帮助。

+0

也许'if(false)'? –

回答

2

你可以做到这一点,如果你改变DEBUG_CODE

#ifdef DEBUG 
    # define DEBUG_CODE(code) abcd::code; 
    #else 
    # define DEBUG_CODE(code) ; 
    #endif 

,然后你会这样称呼它:

if(some_condition) DEBUG_CODE(func_name()) 

在调试模式下,该调用你的函数,并在释放模式无码产生。

如果你想能够将这些函数的返回值赋给变量或从它们返回(尽管我不认为这是一个好主意,正如我在评论中解释的那样),我会让宏接受调用调试模式以及在发布模式下使用什么。

#ifdef DEBUG 
    # define IF_DEBUG_ELSE(debug_code, release_code) abcd::debug_code 
    #else 
    # define IF_DEBUG_ELSE(debug_code, release_code) release_code 
    #endif 

这至少在你调用宏时发生了什么。
这可以用于像:

return IF_DEBUG_ELSE(check_result(), 0);//0 for success 
    if(IF_DEBUG_ELSE(check_condition(), true)){} 
    XYZ xyz = IF_DEBUG_ELSE(get_xyz(), First_XYZ); 

等等这样的。

+0

这可能运行良好,除了在某些情况下,'func_name()'被用作表达式来返回要分配的值。例如'int rs = abcd :: code'。如果它被'#define'替代,那么它将等于int rs =;。我可以这样做:#define DEBUG_CODE(code)0;',但是'rs'也可以是Enum。我将编辑该问题以反映不同的情况。 – user1173240

+2

@ user1173240这似乎是一个坏主意,调试代码应该用于额外的检查以帮助开发。如果您开始返回这些错误值并在开发期间开始依赖它们(或者其他人没有意识到它们只是调试检查),则代码将无法按预期工作。 – SirGuy

+0

@GuyGear我知道,但这是代码的一个旧部分,它正在被简化。对于发行版本,它需要更长的'abcd' DLL,但我们需要它来进行调试,否则开发将会受到影响。我试图用一些草率的设计来应付最佳状态。无论如何,“if(DEBUG)”是不可避免的,我只想要一个更清晰的方式来做到这一点。 – user1173240