Влияет ли встроенная функция без кода на выводимый двоичный файл?
Короче говоря, я пытаюсь сделать так, чтобы отладочная версия моей программы выводила дополнительную информацию. Но вместо того, чтобы проверять
#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