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