簡體   English   中英

用C宏調用Associative *函數

[英]Calling an Associative* Function with C Macros

*不要與關聯數組有關。

我知道如何使用宏對C函數進行矢量化處理,以提供類似於Mathematica的Map(或Apply)功能的結果。 即將函數應用於參數列表。

#define Apply( type, function, ...)             \
{                                               \
   void *Stop = (int[]){0};                     \
   type **List = (type*[]){__VA_ARGS__, Stop};  \
   for( int i = 0; List[i] != Stop; ++i )       \
   function( List[i] );                         \
}                     

然后我可以做類似的事情

#define FreeAllAtOnce(...) Apply( void, free, __VA_ARGS__ );

效果是

free( Array1 );
free( Array2 );
free( Array3 );

相當於

FreeAllAtOnce( Array1, Array2, Array3 );

我沒有化妝,我在書中讀到它,從那以后就大量使用了。

我的問題是:我可以做一些類似於通過一些二進制函數聯合組合數組的事情。 例如,使用GCD功能。 我想要一個像這樣的函數:

GCD_all( a, b, c, d, e );

效果與

GCD( GCD( GCD( GCD( a, b ), c ), d ), e );

對於任何數量的參數。

我已嘗試執行此操作,但無法使其正常工作。 對於可能還有其他參數傳遞給函數的情況,我也很感興趣。 從最一般的意義上講,我希望通過類似的功能來做到這一點:

Atype BinaryCombine( Atype a, Atype b, OtherType z, OtherType y )

這樣我就可以了

Atype BinaryCombineAll( Atype a, Atype b, Atype c, Atype d, OtherType z, OtherType y )

我希望這是有道理的。 任何想法或幫助將不勝感激!

謝謝。

這需要相當復雜的機制(有關更多詳細信息,請參見此答案 ),因為通常無法在C中使用遞歸宏:

#define _NUM_ARGS2(X,X5,X4,X3,X2,X1,N,...) N
#define NUM_ARGS(...) _NUM_ARGS2(0,__VA_ARGS__,5,4,3,2,1,0)
// be sure to add X6,X7,... and 6,7,... to support more arguments

#define GCD_OF_1(a)         (a)         
#define GCD_OF_2(a,b)       GCD(a, b)
#define GCD_OF_3(a,b,...)   GCD_OF_2(GCD_OF_2(a,b),__VA_ARGS__)
#define GCD_OF_4(a,b,...)   GCD_OF_3(GCD_OF_2(a,b),__VA_ARGS__)
#define GCD_OF_5(a,b,...)   GCD_OF_4(GCD_OF_2(a,b),__VA_ARGS__)
// in general:
// #define GCD_OF_N(a,b,...)   GCD_OF_N-1(GCD_OF_2(a,b),__VA_ARGS__)

#define _GCD_OF_N3(N, ...)  GCD_OF_ ## N(__VA_ARGS__)
#define _GCD_OF_N2(N, ...) _GCD_OF_N3(N, __VA_ARGS__) // helper macro to expand N
#define GCD_all(...)       _GCD_OF_N2(NUM_ARGS(__VA_ARGS__), __VA_ARGS__)

int main(void)
{
    GCD_all(a, b, c, d, e);
}

gcc -E產生的輸出為:

int main(void)
{
  GCD(GCD(GCD(GCD(a, b), c), d), e);
}

NUM_ARGS自動查找參數數量。 這樣,您將獲得“起點”宏GCD_OF_N以進行進一步擴展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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