我正在撰寫一個庫,讓用戶可以像這樣裝飾函式名稱:
#ifndef DECORATE // Define this before including if you want to change the names.
#define DECORATE(name) lib_##name
#endif
我現在用什么_Generic來創建這樣的通用函式foo:
#define DECORATE(foo)(x) \
_Generic((x), \
int: DECORATE(fooi), \
float: DECORATE(foof) \
)(x)
這當然會給我一個錯誤,因為我不能定義DECORATE宏兩次。有沒有辦法裝飾通用函式的名稱或者這是不可能的?
uj5u.com熱心網友回復:
您需要為宏指定兩個不同的名稱,以便一個可以使用另一個。此外,在 using 的情況下_Generic,兩個引數都需要在一組括號中,用空格分隔。
#ifndef DECORATEX
#define DECORATEX(name) lib_##name
#endif
#define DECORATE(foo,x) \
_Generic((x), \
int: DECORATEX(foo##i), \
float: DECORATEX(foo##f) \
)(x)
void lib_abci(int x)
{
printf("in abci, x=%d\n", x);
}
void lib_abcf(float x)
{
printf("in abcf, x=%f\n", x);
}
int main()
{
int a=3;
float b=4.5;
DECORATE(abc,a);
DECORATE(abc,b);
return 0;
}
輸出:
in abci, x=3
in abcf, x=4.500000
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/426107.html
上一篇:帶有一些引數的通用介面的依賴注入
