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.

IE

 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`

所以..多种情况..

谢谢你的帮助。

4

1 回答 1

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);

诸如此类。

于 2013-10-03T13:40:46.403 回答