2010-02-01 5 views
2

У меня есть основная функция, которую я могу вызвать из настраиваемого модуля продукта.Проверка возвращаемого значения функции в макросе

function_core является основной функцией, которая будет возвращать целое число и мы имеем макрос в файле заголовка:

#define func_cust function_core 

Я зову func_cust внутри моего собственного кода. Но внутри ядра мы снова называем некоторую другую основную функцию:

#define function_core main_core 

, так что я не могу поставить в моем заказном коде всех аргументов.

Я звоню этому func_cust вызов функции во многих C файлов.

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

Например, я хочу, чтобы определить макрос, как это:

#define funct_cust ((function_core==x)?0:function_core) 

Возможно ли это?

Чтобы быть более конкретным, это то, что мне нужно!

#include<stdio.h> 

#define sum_2 ((sum_1==11)?0:sum_1) 
#define sum_1(a,b) sum(a,b) 
int sum(int ,int); 

int main() 
{ 
int a,b,c; 
a=5; 
b=6; 
c=sum_2(a,b); 
printf("%d\n",c); 
} 

int sum(int x,int y) 
{ 
return x+y; 
} 

это дает ошибку:

"test_fun.c", строка 12.3: 1506-045 (S) Необъявленный идентификатор sum_1.

У меня есть доступ к игре с этим макросом sum_2.

+0

Возможно, вам следует показать код своих функций 'function_core' и' main_core' и т. Д. – kennytm

ответ

3

Если вы можете добавить реальную функцию, было бы довольно легко:

int sanitize(int value, int x) 
{ 
    return (value == x) ? 0 : value; 
} 

Затем просто изменить макрос в

#define func_cust sanitize(func_core(), x) 

Это решает иначе волосатую проблему не оценки вызова функции дважды, и не нужно вводить временное (что трудно сделать в макросе).

Если оценивать дважды в порядке, то, конечно, просто сделать это, как вы указано:

#define func_cust func_core() == x ? 0 : func_core() 
3

Лучше написать функцию инлайн (C99 поддерживает это):

static const int x = ...; 
static inline int funct_cust(void* args) { 
    int res = function_core(args); 
    if (res == x) return 0; 
    return res; 
} 

Если вы используете GCC, вы можете использовать statement exprs:

#define funct_cust(args) ({ int res = function_core(args); res == x ? 0 : res; }) 
0

изменить его на (предполагая, что а, Ь постоянна)

#define sum_2(a,b) ({(sum_1(a,b)==11)?0:sum_1(a,b);}) 
#define sum_1 sum 
int sum(int ,int); 

Это не безопасно, потому что a,b может быть не константные выражения тоже. Таким образом, вы можете создать локальные переменные холдинговая значение а, Ь, поэтому они оцениваются только один раз (улучшенный)

#define sum_2(a,b) ({       \ 
    typeof(a) _a = (a);      \ 
    typeof(b) _b = (b);      \ 
    sum_1(_a, _b) == 11 ? 0 : sum_1(_a,_b); \ 
}) 
#define sum_1 sum 
int sum(int ,int); 

Не пропустите ни одной из фигурных скобок, запятой в последнем заявлении, и косые черты.

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