#define 声明的解释

3

gcc 4.4.1

我正在维护某人的代码,遇到了一些我不理解的问题。

#define RES_API(name, func) name##_##func

有人能解释一下吗?

非常感谢。

4个回答

6

##是一个连接运算符。在你的代码中使用RES_API(name1, func1)将被替换为name1_func1。更多信息请参见这里


4
## 运算符将两个标记连接在一起。在您的情况下,name 与下划线相连,然后再与 func 相连。
因此,RES_API(aName, aFunc) 的结果为 aName_aFunc
单独看起来可能有点烦人。我可以看到在混合 C 和 C++ 代码时会有用处,因为 C 库倾向于给它们的函数加前缀,而 C++ 库则会将它们放在命名空间中。
如果给出另一个定义,例如:
#define RES_API(name, func) name##::##func

您现在可以使用一种通用的方式在C接口和C++之间进行切换。


你真的需要在C++代码中使用令牌粘贴运算符吗?我会期望编译器会抱怨'::'不是一个有效的标识符。 - Jonathan Leffler

4

谢谢,那是一个很棒的链接。里面还有其他一些东西,我需要为别人做可变参数函数。太好了。 - ant2009

1

使用这个宏,你可以用RES_API(OBJ, DoSomething)代替OBJ_DoSomething。个人认为这有点傻。


2
预处理器的很多东西看起来都是“傻瓜式”的,直到你突然发现没有它就无法进行。 :) - KevinDTimm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接