我有核心功能,我可以从产品的自定义模块调用。
function_core
是将返回和整数的核心函数
我们在头文件中有一个宏:
#define func_cust function_core
我在打电话
我自定义代码中的func_cust
。
但在核心内部,我们再次调用其他核心功能:
#define function_core main_core
所以我不能把所有参数都放在我的自定义代码中。
我在许多 C 文件中调用此func_cust
函数调用。
我需要检查函数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。
答案 0 :(得分: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()
答案 1 :(得分: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; })
答案 2 :(得分:0)
将其更改为(假设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);
不要错过任何花括号,最后一个语句中的分号和斜杠。