фонкомпилятор предупреждает об отсутствии символ препроцессора
У меня есть C проект, который имеет заголовочный файл настроек, например:
// config.h
#define FEATURE_1_AVAILABLE 1
#define FEATURE_2_AVAILABLE 0
#define FEATURE_3_AVAILABLE 1
модули используют эти флаги для включения/исключения объектов из сборки :
#include "config.h"
void foo(void) {
...
#if FEATURE_1_AVAILABLE
useFeature1();
#endif
...
Существуют разные версии config.h
для разных сборок.
Проблема
#include "config.h"
получил случайно удалены, поэтому функция не активна, даже когда он был включен в конфигурации.
К сожалению, #if FEATURE_1_AVAILABLE
молча оценивает 0
, когда не определено. Поэтому мне нужна ошибка, если она не определена.
Вариант 1
Я мог бы добавить дополнительный 'если определено' тест на каждом состоянии.
#ifndef FEATURE_1_AVAILABLE
#error No feature 1
#elif FEATURE_1_AVAILABLE
useFeature1();
#endif
Даунсайда является то, что один флаг функции может быть проверен в многих разных местах в модуле, и добавление нескольких строк препроцессора не собирается сделать код симпатичнее.
Вариант 2
Добавить одного теста в начале модуля:
#ifndef FEATURE_1_AVAILABLE
#error No feature 1
#endif
Но это может быть потерян/забыт по тем же причинам, что #include "config.h"
было.
Вариант 3
Определить флаги в виде макросов:
#define FEATURE_1_AVAILABLE() 1
и использовать как:
#if FEATURE_1_AVAILABLE()
Unfortunaltely это также потерпит неудачу тихо, если вы забыли скобку:
#if FEATURE_1_AVAILABLE
Опция X
Есть ли лучший вариант? Что-то, что даст сообщение об ошибке во время компиляции, если символ не определен или неправильно написан. И, надеюсь, не превращает код в незаметный препроцессорный беспорядок.
Другие вещи
- время выполнения проверки не представляется возможным. Отключенные функции не должны находиться в двоичном формате.
- Особенности должны быть определены в файле. Определение их как глобальных параметров компилятора имеет другие проблемы.
- Это для встроенной системы. Некоторые из этих функций требуют аппаратного обеспечения для работы, и тестирование очень трудоемко. Таким образом, предпочтение отдается ошибкам во время компиляции.
Найти лицо, ответственное за удаление включают, и боп этот человек на голове. Если вам действительно нужен такой файл заголовка, который входит во все исходные файлы, все разработчики должны это знать. Кроме того, такие вещи должны были автоматически определяться автоматическими модульными тестами (у вас есть * автоматические модульные тесты?) И были бы исправлены до того, как программа когда-либо достигнет клиента. –
@JoachimPileborg Но я не хочу ударить себя :) Это было удалено случайно. О модульных тестах: Как я уже писал, тестирование некоторых из них без аппаратного обеспечения невозможно. Поэтому такие ошибки дешевле исправить, когда они обнаружены во время компиляции. – user694733
@ JimBalter При быстром взгляде это может быть обман. Я буду смотреть дальше и закрыть это, если это так. – user694733