Влияет ли встроенная функция без кода на выводимый двоичный файл?

Короче говоря, я пытаюсь сделать так, чтобы отладочная версия моей программы выводила дополнительную информацию. Но вместо того, чтобы проверять

#IFDEF DEBUG
...
#ENDIF

в середине кода высокого уровня, я бы предпочел сделать что-то вроде этого

Debug::PrintDebugMessage(...);

Итак, мой вопрос, если бы я сделал эту гипотетическую функцию примерно так

inline static void PrintDebugMessage(...);
void PrintDebugMessage(...)
{
   #IFDEF DEBUG
   ...
   #ENDIF
}

Изменится ли результирующая программа, если DEBUG не определен? То есть, если бы я вызывал эту функцию, пока DEBUG не был определен, произойдет ли что-нибудь низкоуровневое в коде, или компилятор просто пропустит пустую функцию? (Прошу прощения, если я сформулировал это смущенно)

2 ответа

Решение

Почему бы просто не реализовать PrintDebugMessage(...) макрос?

Вы определяете:

#ifdef _DEBUG
#  define PrintDebugMessage(...) \
     <Implement>
#else
#  define PrintDebugMessage(...)
#endif

Вы не получите код, сгенерированный в вашем бинарном выпуске, но, что более важно, вы можете использовать __LINE__, __FILE__ макросы, а также __func__ функция. Они отлично подходят для отладки, но полезны только в макросах.

inline void PrintDebugMessage(..) {
#ifdef DEBUG
...
#endif
}

Встроенная функция, которая ничего не делает, ничего не делает.
Имейте в виду, что побочный эффект вычисления аргумента все еще выполняется. Так что это правильный путь.

Другой метод, который не вызывает вычисление аргумента (без отладки):

#if defined(DEBUG)
# define PrintDebugMessage(..) PrintDebugMessage_implementation(..)
inline void PrintDebugMessage_implementation(..) {
    ..
}
#else
# define PrintDebugMessage(..) do { } while (false) /* Do nothing */
#endif
Другие вопросы по тегам