2016-03-16 3 views
3

У меня есть программа, состоящая из разных модулей. Модули взаимосвязаны через вызовы функций. Например. State Init вызывает функцию init каждого модуля. Должно быть возможно отключить модули (исключить из компиляции). Самый простой способ - использовать препроцессоры. Но это порождает огромное количество коды:Пропуск вызова функции, если не задан

#IF MODULE_XXX_COMPILE 
    ret = module_func(...); 
#ELSE 
    ret = 0; 
#ENDIF 

Я хотел бы получить макрос так:

ret = MOD_COMPILE_CALL(module_func(...)); 

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

+0

Не видя ваш код макроса мы не в состоянии помочь вам – ckruczek

+0

ли это наоборот. Условно: #define MOD_COMPILE_CALL (x) 'для расширения до' x' или '0' в зависимости от' MODULE_XXX_COMPILE'. – kaylum

+0

Не проще ли построить систему сборки между полной или заглушкой версии модуля? Таким образом, все вызовы остаются такими, как если бы все модули были включены, но функции модуля ничего не делают, когда выбран заглушка. Не беспокойтесь о стоимости пренебрежимой производительности, пока вы не сможете ее измерить. –

ответ

6

Вместо использования #if внутри макроса, который, вероятно, не работает, вы можете просто принять его:

#if MODULE_XXX_COMPILE == 1 
    #define MOD_COMPILE_CALL(fcall) (fcall) 
#else 
    #define MOD_COMPILE_CALL(fcall) (0) 
#endif 
+0

@ user694733 Хорошая точка. Просто отредактирован ... – dragosht

1

Вот пример, чтобы сделать то, что вы хотите:

#if MODULE_XXX_COMPILE == 1 
    #define MOD_COMPILE_CALL(x) (x) 
#else 
    #define MOD_COMPILE_CALL(x) (0) 
#endif 

Если MODULE_XXX_COMPILE определяется как 1, MOD_COMPILE_CALL(module_func(...)); расширяет до (module_func(...)). В противном случае это всего лишь 0.

+0

Ну, это несколько подвержено ошибкам. Улучшено сейчас. –

3

Да, это возможно.

Определение IF_MOD_XXX:

#if MODULE_XXX_COMPILE 
#define IF_MOD_XXX(mod_enabled, mod_disabled) mod_enabled 
#else 
#define IF_MOD_XXX(mod_enabled, mod_disabled) mod_disabled 
#endif 

Использование:

int ret = IF_MOD_XXX(module_func(), 0); 
+0

Действительно хороший ответ, когда возврат по умолчанию определяется при вызове вместо жесткой записи в макрос! – Garf365

Смежные вопросы