Проверка возвращаемого значения функции в макросе - PullRequest
2 голосов
/ 01 февраля 2010

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

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

#define func_cust function_core

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

 #define function_core main_core

поэтому я не могу вставить в свой настраиваемый код все аргументы.

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

Мне нужно проверить возвращаемое значение функции function_core вроде если function_core возвращает x, тогда я хочу изменить возвращаемое значение на 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.

Ответы [ 3 ]

3 голосов
/ 01 февраля 2010

Лучше написать встроенную функцию (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, вы можете использовать выражение exprs :

#define funct_cust(args) ({ int res = function_core(args); res == x ? 0 : res; })
3 голосов
/ 01 февраля 2010

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

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()
1 голос
/ 25 октября 2012

Измените его на (при условии, что a, b является константой)

#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 также может быть не константным выражением. Поэтому вы можете создать локальные переменные, содержащие значения 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);

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

...