代码之家  ›  专栏  ›  技术社区  ›  ZNackasha

通过宏将函数参数传递给函数

  •  0
  • ZNackasha  · 技术社区  · 7 年前

    我想创建一个宏,其中一个参数是宏中使用的函数的参数。

    #define Macro(PERAMS, OTHER) \
        functionBeingUsed(PERAMS); \
        OTHER; 
    
    
    Macro(1,2,3,4, int i = 0);
    

    如您所见,宏和函数都在使用逗号。这会导致代码损坏。

    我想知道是否有办法达到我需要的结果,这样代码就可以像下面这样解释。

    Macro((1,2,3,4), int i = 0);
    

    请注意我没有使用C++11。

    5 回复  |  直到 7 年前
        1
  •  2
  •   o11c    7 年前

    每当您需要对预处理器执行任何非平凡的操作时,您应该 立即 跳转到boost.pp库。这里,那个 BOOST_PP_REMOVE_PARENS 宏似乎是相关的:

    #define Macro(PARAMS, OTHER) \
        functionBeingUsed(BOOST_PP_REMOVE_PARENS(PARAMS)); \
        OTHER; 
    
    Macro((1,2,3,4), int i = 0);
    

    或者,你可以直接写信 functionBeingUsed PARAMS 并使用传递的括号。

        2
  •  1
  •   mikebob    7 年前

    你所描述的是不可能做到的。但是,您可以使用 variadic macros 是的。您需要将params部分放在末尾,它将如下所示:

    #define Macro(OTHER, ...) \
        functionBeingUsed(__VA_ARGS__); \
        OTHER;
    
    Macro(int i = 0, 1, 2, 3, 4);
    
        3
  •  0
  •   ZNackasha    7 年前

    我相信唯一的答案是使用多个宏

    #define MacroBegin \
       \\PreFunction
    
    #define MacroEnd \
       \\PostFunction
    
    MacroBegin
    functionBeingCalled(1,2,3,4);
    MacroEnd
    
        4
  •  0
  •   Remy Lebeau    7 年前

    要区分哪些逗号属于宏本身,哪些属于要调用的函数,必须将函数参数括在括号中,例如:

    Macro((1,2,3,4), int i = 0);
    

    然后必须从宏内的函数调用中删除括号,因为它们将来自宏参数,例如:

    #define Macro(PERAMS, OTHER) \
        functionBeingUsed PERAMS; \
        OTHER; 
    

    所以,就像这样:

    宏((1,2,3,4),int i=0);
    

    将解决此问题:

    functionBeingUsed (1,2,3,4);
    int i = 0; 
    

    即使调用的函数不带任何输入参数,也要记住额外的括号:

    Macro((), ...);
    

    functionBeingUsed ();
    ...; 
    
        5
  •  0
  •   Jarod42    7 年前

    要保持语法,可以执行以下操作:

    #define COUNT_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...)    N
    #define COUNT(...)   COUNT_N(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
    // Warning: COUNT() return 1 (as COUNT(A)) :-/
    
    #define IDENTITY(N) N
    #define APPLY(macro, ...) IDENTITY(macro(__VA_ARGS__))
    
    #define F_1(a) functionBeingUsed(); a;
    #define F_2(a, b) functionBeingUsed(a); b;
    #define F_3(a, b, c) functionBeingUsed(a, b); c;
    #define F_4(a, b, c, d) functionBeingUsed(a, b, c); d;
    #define F_5(a, b, c, d, e) functionBeingUsed(a, b, c, d); e;
    #define F_6(a, b, c, d, e, f) functionBeingUsed(a, b, c, d, e); f;
    #define F_7(a, b, c, d, e, f, g) functionBeingUsed(a, b, c, d, e, f); g;
    #define F_8(a, b, c, d, e, f, g, h) functionBeingUsed(a, b, c, d, e, f, g); h;
    
    #define DISPATCH(N) F_ ## N
    
    #define Macro(...) IDENTITY(APPLY(DISPATCH, COUNT(__VA_ARGS__)))(__VA_ARGS__)
    

    Demo

    但更简单的方法是将语法更改为:

    #define Macro(PARAMS, OTHER)  \
        functionBeingUsed PARAMS; \
        OTHER;
    
    Macro((1,2,3,4), int i = 0);