C预处理器:#define一个可以在没有括号的情况下调用的宏

时间:2015-11-06 09:06:47

标签: c c-preprocessor

我想知道是否可以编写一个行为如下的宏:

viewpager

在这种情况下,viewpager将指向实际函数void Func(int x) { printf("%d",x); } #define func Func x //or something int main() { func 10; //<---- remove parenthesis } ,而10将是不带括号的参数。

我试图在C ++中尝试使用与func运算符类似的东西但在C中。

示例:

Func

在这种情况下,newclass Base* b = new(Base); 的宏,class是一个带有函数指针的函数,struct是一个为{分配内存的函数{1}}。

我想将代码重写为:

new

如果我能想出一个宏,那将是可能的:)

2 个答案:

答案 0 :(得分:2)

有趣的是,你可以通过定义new离开(#define new)并为每个类似构造函数的函数定义一个标记来生成一个带括号的真实函数调用,例如#define BASE Base()

这应该使以下代码合法C:

#define new
#define class struct
#define BASE Base()

// forward declaration
class Base;
extern class Base *Base();

void f()
{
    class Base* b = new BASE;
}

答案 1 :(得分:1)

我认为你不能做你想做的事。如果您有一个带参数的宏,例如#define func(x) Func(x),那么您需要像调用函数一样调用它:

#define func(x) Func(x)
func(x) // Will be replaced by Func(x) during pre-processing

如果您有一个没有参数的宏,那么在预处理期间只需替换该值:

#define MY_VAL 110
func(MY_VAL) // Will be replaced by Func (110) during pre-processing

移除第一个支架很容易......

#define func Func(
func 10);

......完全有效,但很奇怪。不幸的是,我认为没有办法删除结束括号。

正如Joachim Pileborg在他的评论中指出的那样,我没有看到的理由在真正的C计划中这样做。