4

宏“VER”在其他一些我无法更改的头文件中定义为“((u_long)1)”。

在我的代码中,我需要使用“test”和 VER 编写函数“test_1”。但是编译器报告了错误,因为它是“test_((u_long)1)”而不是“test_1”生成的。

我的问题是:如何编写宏以生成“test_1”?

提前致谢!

#define VER ((u_long)1)      /* This is defined in some other header file which I can't change*/

#define paste(x, y, z) x ## y ## z
#define paste2(x, y, z) paste(x, y, z)
#define fcall(fname) paste2(fname, _, VER)

int test_1() {
  return 0;
}

int main() {
  fcall( test )();
  return 0;
}
4

3 回答 3

6

我不能保证它是 100% 便携的,但它应该可以工作:

#define VER ((u_long)1)

#define STRIP1(x) STRIP2 x

#define STRIP2(x) STRIP3 x

#define STRIP3(x)

#define paste(x, y, z) x ## y ## z
#define paste2(x, y, z) paste(x, y, z)
#define fcall(fname) paste2(fname, _, STRIP1(VER))

活生生的例子

它通过将定义中的括号解释VER为宏调用来工作。这是发生时的各个扩展:

STRIP1(VER) // STRIP1 with argument VER

STRIP2 ((u_long)1) // STRIP2 with argument (u_long)1

STRIP3 (u_long)1  // STRIP3 with argument u_long, followed by 1

1

如果我们重新排列空格(无论如何它是微不足道的),我们会得到:

STRIP1(VER)

STRIP2((u_long) 1)

STRIP3(u_long) 1

1
于 2013-07-23T10:28:10.150 回答
0

作为修改后的 Angew 版本

#define VER ((u_long)1)

#define _(x) x
#define id(x) _(x)

#define STRIP3(x)
#define STRIP2(x) id(STRIP3 x)
#define STRIP1(x) id(STRIP2 x)

#define paste(x, y, z) x ## y ## z
#define paste2(x, y, z) paste(x, y, z)
#define fcall(fname) paste2(fname, _, STRIP1(VER))
于 2013-07-23T10:42:32.613 回答
0

有了那个来源,你可能不能,因为宏扩展是文本的,所以((u_long)1)不可能变成1.

一种解决方案当然是实际编写一些代码来打印VER. 另一种选择是说服拥有该文件的人您无法更改,他们应该为您更改它...

于 2013-07-23T10:19:22.403 回答