间接预处理器替换C.

时间:2014-01-16 23:30:33

标签: c c-preprocessor

宏有没有办法使用传递给它的定义值,而不是定义文本本身?

这是一个奇怪的例子,我预计可以使用预处理器。

名为test.c C 文件,其中包含两次以定义从main调用的两个不同函数。

#ifndef IS_INDIRECT
#define IS_INDIRECT

/* int */
#define NUMTYPE int
#define PREFIX int_

#include "test.c"

#undef NUMTYPE
#undef PREFIX

/* short */
#define NUMTYPE float
#define PREFIX float_

#include "test.c"

#undef NUMTYPE
#undef PREFIX

#include <stdio.h>

int main(int argc, const char **argv)
{
    printf("test int %d\n", int_squared(4));
    printf("test float %f\n", float_squared(2.5));

    return 0;
}

#else

/* function body */

#define fn(prefix, id) prefix ## id

NUMTYPE fn(PREFIX, squared)(NUMTYPE val)
{
    return val * val;
}

#endif

给出以下错误:

In file included from test.c:18:0:
test.c:37:12: error: conflicting types for 'PREFIXsquared'
 NUMTYPE fn(PREFIX, squared)(NUMTYPE val)
            ^
test.c:35:24: note: in definition of macro 'fn'
 #define fn(prefix, id) prefix ## id
                        ^
In file included from test.c:9:0:
test.c:37:12: note: previous definition of 'PREFIXsquared' was here
 NUMTYPE fn(PREFIX, squared)(NUMTYPE val)
            ^
test.c:35:24: note: in definition of macro 'fn'
 #define fn(prefix, id) prefix ## id

我想让宏将PREFIX扩展为它定义的值,所以我得到int_squared而不是PREFIXsquared

2 个答案:

答案 0 :(得分:5)

这是你想要的吗?

#define _CONCAT(x,y)   x##y
#define CONCAT(x, y)  _CONCAT(x, y)


#define function(type, operation, prm) type CONCAT(operation, type) (type prm)

function (int, square_, value) // int square_int (int value)
{
    return value * value;
}

间接使用##允许定义使用串联的宏(在我们的示例中为function)。当宏 定义 时,CONCAT会扩展为_CONCAT, 当宏 调用 时解析为x##y

编辑:感谢各位贡献者:

答案 1 :(得分:1)

您也可以使用X-Macros执行此操作:

<强> funcs_x.h

/* N.B. no guard macro */
FUNC(int)
FUNC(float)

<强>的main.c

#define FUNC(x_) static x_ x_ ## _squared ( x_ val ) { return val * val; }
#include "funcs_x.h"
#undef FUNC


int main(int argc, const char **argv) { ... }

这似乎就是你要做的事情。