宏有没有办法使用传递给它的定义值,而不是定义文本本身?
这是一个奇怪的例子,我预计可以使用预处理器。
名为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
答案 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) { ... }
这似乎就是你要做的事情。