Отключить функции с помощью MACROS

После поиска довольно много в Интернете для решения я решил спросить здесь, если мое решение в порядке.

Я пытаюсь написать простую и модульную библиотеку регистрации C, предназначенную для простого отключения, и специально помогая студентам и исследователям PhD отлаживать алгоритм, уменьшающий максимально возможное влияние системы ведения журнала.

Моя проблема в том, что я хочу, чтобы пользователь библиотеки мог отключить систему ведения журнала во время компиляции, создав исполняемый файл, в котором стоимость регистратора равна 0.

Код C будет выглядеть так:

... logger_t * logger; result = logger_init(logger); if(result == -1) {...} ... 

это просто инициализирует регистратор. Ищем пример кода, который я проверил в заголовке assert.h, но эта душевность приводит к списку предупреждений в моем случае. Фактически, если logger_init () заменяется на 0 с помощью макроса, это приведет к тому, что переменная logger никогда не будет использоваться.

По этой причине я решил использовать такой подход:

 int logger_init(logger_t *logger); #ifndef NLOG /* NLOG not defined -> enable logging */ int logger_init(logger_t *logger) { ... } #else /* NLOG defined --> the logging system must be disabled */ #define logger_init(logger) (int)((logger = NULL) == NULL) #endif /* NLOG */ 

это не приводит к предупреждениям, и я также избегаю накладных расходов на вызов функции. На самом деле, моя первая попытка заключалась в следующем:

 int logger_init(logger_t *logger) { #ifndef NLOG /* NLOG not defined -> enable logging */ ... #endif return 0; } 

продолжайте вызывать функцию, даже если мне это не нужно.

Как вы думаете, мое решение можно считать хорошим решением? Есть ли лучшее решение?

Большое спасибо, ребята! Приветствия, Армандо

Стандартная идиома для этого, по крайней мере, в 90-е годы, была:

 #ifndef NLOG void logger_init(logger_t *logger); void logger_log(logger_t *logger, ...); #else #define logger_init (void)sizeof #define logger_log (void)sizeof #endif 

Помните, что операнды sizeof не оцениваются, хотя они проверены синтаксисом. Этот трюк работает также с вариационными функциями, потому что оператор sizeof увидит выражение с несколькими запятыми:

 logger_log(log, 1, 2, 3); 

Преобразует в:

 (void)sizeof(log, 1, 2, 3); 

Эти запятые не разделяют параметры ( sizeof не является функцией, а оператором), но они являются операторами запятой .

Обратите внимание, что я изменил возвращаемое значение от int до void . Никакой реальной необходимости для этого, но sizeof возврата был бы в основном бессмысленным.

Не может ли ваша отключенная версия просто быть константой:

 #ifndef NLOG /* NLOG not defined -> enable logging */ int logger_init(logger_t *logger) { ... } #else /* NLOG defined --> the logging system must be disabled */ #define logger_init(logger) 0 #endif /* NLOG */ 

Таким образом, вы просто имеете (после предварительной компиляции): result = 0; который не должен давать никаких предупреждений.