簡體   English   中英

檢查宏中函數的返回值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM