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

В моем проекте VC++(6.0) много журналирования. Регистрация осуществляется функцией

void LogMsg(const char* formatStr, ...)
{
   ....
   ....
}

Чтобы запись в журнале была слишком обширной, комментирование каждой строки было бы очень медленным. Поэтому я прокомментировал содержание функции LogMsg.

Мой вопрос: достаточно ли умен компилятор C++, чтобы игнорировать функцию и вызов функции, выполняющие компиляцию, или он будет компилироваться, и у меня будет ненужный переход в коде из-за пустого вызова функции?

2 ответа

Решение

Если вы хотите быть уверены на 100%, независимо от того, что на самом деле делает компилятор, вы должны определить макрос следующим образом:

#define LogMsg(...)

Этот макрос должен заменить объявление функции LogMsg, и вы можете удалить определение функции из своего кода. Если вы хотите сохранить возможность возобновления регистрации в будущем, вы можете сделать что-то вроде этого:

В заголовочном файле logging.h

#ifdef ENABLE_LOGGING
void LogMsg(const char* formatStr, ...)
#else
#define LogMsg(...)
#endif

В исходном файле logging.cpp

#ifdef ENABLE_LOGGING
void LogMsg(const char* formatStr, ...)
{
    ....
    ....
}
#endif

Затем вы включите или отключите ведение журнала, определяя или не определяя ENABLE_LOGGING в определениях препроцессора вашего проекта.

Если компилятор узнает тело функции, он может это выяснить и удалит ненужный переход. Фактически, сегодняшние компиляторы встраивают большинство функций всякий раз, когда могут, поэтому вам, вероятно, больше не нужно беспокоиться о ненужных переходах.

Другие вопросы по тегам