Macro to prevent code processing

Refresh

December 2018

Views

77 time

2

So I've a piece of code, which will access a DLL namespace function if it's in Debug mode, and which I'd like to comment out if it's in Release.

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


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

While I'd like the #else to define a comment, I suppose you can't do that because they're skipped by the compiler before any code processing, or preprocessing is performed..

If that is correct, then kindly tell me a way to skip the processing of (DEBUG_CODE) func_name();. There are a lot of places where it is used, and I don't wish to add if(DEBUG) everywhere.

EDIT

The namespace DLL has functions which do not return anything, as well as functions which are expected to return a value, and which might be assigned to an enum.

i.e.

 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 scenarios..

Thanks for your help.

1 answers

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

и так далее в этом роде.