#c #cmake #macros #preprocessor
Вопрос:
В моем проекте на c у меня есть несколько макрокоманд препроцессора.В качестве примера:
#define ENABLE_PHOTO_SENSOR //will be put in three source file (.cc file)
#define SAVE_ROOT_FILE //will be placed 6 source file
...
Должен ли я помещать все эти макрокоманды в один заголовочный файл? Если я поступлю так, то при изменении одной из макрокоманд(например, одного макроса undef) и повторной компиляции программы все исходные файлы, включая эти заголовочные файлы, будут скомпилированы снова. Если я использую отдельный файл заголовка для каждой макрокоманды, компилируется только связанный исходный файл. Но я хочу управлять всеми макрокомандами из одного файла, и когда я изменяю макрокоманду, изменяются только файлы, относящиеся к этим макрокомандам.
Наконец, я использую cmake для создания файлов make. Можно ли изменить эти макрокоманды в каталоге сборки?Если это так, то как?
Комментарии:
1. Препроцессор заранее не знает, используется ли какой-либо из ваших макросов в исходном файле. Поэтому, если вы хотите избежать перекомпиляции файлов, вам следует пересмотреть дизайн вашей программы. Лично я бы сказал, что, если только время компиляции не является для вас серьезной проблемой, лучше сохранить все ваши возможности в одном месте и принять удар по компиляции. Сохранение простого дизайна, вероятно, поможет вам в будущем.
2. Есть ли какая-то причина для того, чтобы это были макросы?
3. Вообще говоря, я бы, вероятно, просто вставил оба макроса в один файл заголовка, включил его там, где это необходимо, и принял (небольшое) время компиляции. Только если влияние будет значительным (например, общее время перекомпиляции зависимостей измеряется часами или днями, а не минутой или двумя), я бы побеспокоился о том, чтобы поместить их в отдельные заголовки. Имейте в виду, что на практике заголовочные файлы меняются гораздо реже, чем включающие их исходные файлы. Кроме того, подумайте о том, чтобы найти альтернативу макросам
4. Спасибо тебе за твой ответ, Пэдди. Я использую препроцессор для выполнения условий. поскольку существует несколько несвязанных классов, я предпочитаю использовать макрос препроцессора. В зависимости от выбора пользователя некоторые классы использоваться не будут. Можно ли справиться без макроса препроцессора? может быть, есть лучший способ справиться с этим..
5. Спасибо тебе, @Питер. Я последую вашему совету