[英]Checking the return value of a function in a macro
我具有可以從產品的自定義模塊調用的核心功能。
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。
如果您可以添加實際功能,那將非常簡單:
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()
最好編寫一個內聯函數(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; })
將其更改為(假設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);
不要錯過最后一個語句中的花括號,分號和斜杠。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.