Я пишу небольшую операционную систему для микроконтроллеров в C (не C++, поэтому я не могу использовать шаблоны). Он сильно использует некоторые функции gcc, одним из наиболее важных из которых является удаление неиспользуемого кода. ОС не загружает ничего во время выполнения; программа пользователя и источник ОС скомпилированы вместе, чтобы сформировать единый двоичный файл.Проверка времени компиляции, если функция оптимизирована
Эта конструкция позволяет gcc включать только функции ОС, которые программа фактически использует. Поэтому, если программа никогда не использует i2c или USB, поддержка для них не будет включена в двоичный файл.
Проблема заключается в том, что я хочу включить дополнительную поддержку этих функций без введения зависимости. Например, консоль отладки должна предоставлять функции для отладки i2c, если она используется, но в том числе консоль отладки также не должна вставлять i2c, если программа не использует ее.
Методы, которые приходят на ум для достижения этой цели не являются идеальными:
Есть пользователь явно включить модули, они должны (используя
#define
), а также использовать#if
включать только им поддержку в консоль отладки, если она включена. Мне не нравится этот метод, потому что в настоящее время пользователь не должен этого делать, и я бы предпочел сохранить его таким образом.Имейте модульные указатели функций модуля с модулем отладки при запуске. Это не идеально, потому что он добавляет некоторые служебные данные во время выполнения и означает, что отладочный код разбивается на несколько файлов.
Сделайте то же, что и выше, но используйте слабые символы вместо указателей. Но я до сих пор не знаю, как это сделать.
Выполните тест во время компиляции в коде отладки, например:
if(i2cInit is used) { debugShowi2cStatus(); }
Последний метод кажется идеальным, но возможно ли это?
@quantdev спасибо за фиксации фрагмента кода. Не уверен, почему 4 пробела было недостаточно. – Rena