我想知道是否可以编写一个行为如下的宏:
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
在这种情况下,new
是class Base* b = new(Base);
的宏,class
是一个带有函数指针的函数,struct
是一个为{分配内存的函数{1}}。
我想将代码重写为:
new
如果我能想出一个宏,那将是可能的:)
答案 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
计划中这样做。