Variadic recursive preprocessor macros - is it possible?

前端 未结 6 895
一生所求
一生所求 2020-11-28 07:11

I\'ve run into a little theoretical problem. In a piece of code I\'m maintaining there\'s a set of macros like

#define MAX_OF_2(a, b)       (a) > (b) ? (a         


        
6条回答
  •  囚心锁ツ
    2020-11-28 07:51

    I think that, even if you could expand macros recursively, there would be one little problem with your approach in terms of efficiency... when the macros are expanded, if the MAX_OF_[N-1] is greater, then you have to evaluate it again from scratch.

    Here is a silly and stupid answer that probably no one will like xD

    file "source.c"

    #include "my_macros.h"
    ...
    

    file "Makefile"

    myprogram: source.c my_macros.h
     gcc source.c -o myprogram
    
    my_macros.h: make_macros.py
     python make_macros.py > my_macros.h
    

    file "make_macros.py"

    def split(l):
        n = len(l)
        return l[:n/2], l[n/2:]
    
    def gen_param_seq(n):
        return [chr(i + ord("A")) for i in range(n)]
    
    def make_max(a, b):
        if len(a) == 1:
            parta = "("+a[0]+")"
        else:
            parta = make_max(*split(a))
    
        if len(b) == 1:
            partb = "("+b[0]+")"
        else:
            partb = make_max(*split(b))
    
        return "("+parta +">"+partb+"?"+parta+":"+partb+")"
    
    for i in range(2, 9):
        p = gen_param_seq(i)
        print "#define MAX_"+str(i)+"("+", ".join(p)+") "+make_max(*split(p))
    

    then you'll have those pretty macros defined:

    #define MAX_2(A, B) ((A)>(B)?(A):(B))
    #define MAX_3(A, B, C) ((A)>((B)>(C)?(B):(C))?(A):((B)>(C)?(B):(C)))
    #define MAX_4(A, B, C, D) (((A)>(B)?(A):(B))>((C)>(D)?(C):(D))?((A)>(B)?(A):(B)):((C)>(D)?(C):(D)))
    #define MAX_5(A, B, C, D, E) (((A)>(B)?(A):(B))>((C)>((D)>(E)?(D):(E))?(C):((D)>(E)?(D):(E)))?((A)>(B)?(A):(B)):((C)>((D)>(E)?(D):(E))?(C):((D)>(E)?(D):(E))))
    #define MAX_6(A, B, C, D, E, F) (((A)>((B)>(C)?(B):(C))?(A):((B)>(C)?(B):(C)))>((D)>((E)>(F)?(E):(F))?(D):((E)>(F)?(E):(F)))?((A)>((B)>(C)?(B):(C))?(A):((B)>(C)?(B):(C))):((D)>((E)>(F)?(E):(F))?(D):((E)>(F)?(E):(F))))
    #define MAX_7(A, B, C, D, E, F, G) (((A)>((B)>(C)?(B):(C))?(A):((B)>(C)?(B):(C)))>(((D)>(E)?(D):(E))>((F)>(G)?(F):(G))?((D)>(E)?(D):(E)):((F)>(G)?(F):(G)))?((A)>((B)>(C)?(B):(C))?(A):((B)>(C)?(B):(C))):(((D)>(E)?(D):(E))>((F)>(G)?(F):(G))?((D)>(E)?(D):(E)):((F)>(G)?(F):(G))))
    #define MAX_8(A, B, C, D, E, F, G, H) ((((A)>(B)?(A):(B))>((C)>(D)?(C):(D))?((A)>(B)?(A):(B)):((C)>(D)?(C):(D)))>(((E)>(F)?(E):(F))>((G)>(H)?(G):(H))?((E)>(F)?(E):(F)):((G)>(H)?(G):(H)))?(((A)>(B)?(A):(B))>((C)>(D)?(C):(D))?((A)>(B)?(A):(B)):((C)>(D)?(C):(D))):(((E)>(F)?(E):(F))>((G)>(H)?(G):(H))?((E)>(F)?(E):(F)):((G)>(H)?(G):(H))))
    

    and the best thing about it is that... it works ^_^

提交回复
热议问题