如何在令牌粘贴之前在宏参数中操作?

时间:2015-06-21 19:01:02

标签: c macros

我的函数(ansi c)在其定义中是递归的。因此,它的形式为:

void function_2(int *value){
    /*this is the base function*/
}
void function_4(int *value){
    function_2(value);
    function_2(value);
    /*other operations*/
}
void function_8(int *value){
    function_4(value);
    function_4(value);
    /*other operations*/
}

等等。 要创建这些函数,我正在创建宏,例如:

#define FUNCTION( m, h)\
void function_##m(int *value){\
    function_##h(value);\
    function_##h(value);\
    /*other operations\
};

然后我按如下方式做出声明:

FUNCTION(4,2)
FUNCTION(8,4)

请注意,第二个宏参数(h)始终是第一个宏参数(m)的值的一半。有没有任何方法,所以我只能使用一个参数(m)来制作宏,而不是使用它,所以当我连接它时(使用##)我可以使用“m / 2”而不是h?

它应该是:

function_##m/2(value);\

1 个答案:

答案 0 :(得分:1)

您不能像您想要的那样使用编译时计算和令牌粘贴。另一方面,如果/*other operations*/相同且仅m的值发生变化,则最好将m变为参数,而不是使用宏来定义许多函数。

您可以使其类似于以下内容:

void function(int m, int *value) {
    if ( m == 2 ) {
        /*run base code*/
    } else {
        function(m/2, value);
        function(m/2, value);
        /*other operations*/
    }
}