2010-02-01 48 views
2

我有核心功能,可以從產品的定製模塊調用。檢查宏中函數的返回值

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。

+0

也許你應該顯示你的'function_core'和'main_core'等代碼 – kennytm 2010-02-01 15:46:24

回答

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

將其更改爲(假設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可以是非恆定表達式太。所以,你可能要創建局部變量保持一定的值,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); 

不要錯過任何花括號,分號中的最後一條語句,和斜槓。