Есть ли способ поручить компилятору C ++ пропустить оставшуюся часть текущего файла? - PullRequest
2 голосов
/ 04 августа 2011

Время от времени некоторые функции должны быть скомпилированы условно.Например, есть class Logger, который используется только тогда, когда макрос WITH_LOGGING равен #define d:

// Logger.cpp
#ifdef WITH_LOGGING
#include <Logger.h>
// several hundred lines
// of class Logger
// implementation
// follows
#endif

, что не очень удобно - если читатель не просматривает файл, он не может быть уверенчто соответствующий #endif - это позиция в конце файла, и поэтому все содержимое файла исключается с помощью #ifdef.Я бы предпочел иметь что-то вроде этого:

// Logger.cpp
#ifndef WITH_LOGGING
#GetOutOfThisFile
#endif
#include <Logger.h>
// several hundred lines
// of class Logger
// implementation
// follows

, чтобы было ясно, что если WITH_LOGGING не #define d, то компилятор просто пропускает остальную часть файла.

Возможно ли что-то подобное в C ++?

Ответы [ 2 ]

8 голосов
/ 04 августа 2011

Простой способ прояснить это - поместить реализацию в другой файл, который входит в состав:

файл Logger.cpp:

#ifdef WITH_LOGGING
 #include <Logger.h>
 #include "logger.impl"
#endif

файл logger.impl:

// several hundred lines
// of class Logger
// implementation
// follows
0 голосов
/ 04 августа 2011

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

Это не будет работать, если у вас есть функции, переопределенные из других библиотек, но для обычного случая (и, скорее всего, для регистрации) этого будет достаточно.В GCC это --ffunction-section для компилятора и --gc-section для компоновщика.Visual Studio должен иметь сопоставимые флаги, но я не знаю, что они.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...