当一个函数没有任何参数时,define
可以不用括号调用它作为
#define test test()
是否可以在没有paranthesis的情况下调用带参数的函数?像
这样的东西#define test test(char *arg)
test "argument 1";
答案 0 :(得分:13)
在C语言中你不可能拥有它。标准(C99)的§6.5.2描述了后缀表达式,并且没有这样的语法。函数调用是(§6.5.2.2):
后缀表达式后跟括号
()
,其中包含可能为空的逗号分隔的表达式列表,是一个函数调用。后缀表达式表示被调用的函数。表达式列表指定函数的参数。
Parens不是可选的,它们需要包装所有参数,因此您需要一个类似函数的宏(需要在“call”站点上的parens)或两个单独的东西(一个用于插入起始paren,一个用于插入结束的一个)。
你可以这样做:
#define test puts(
#define end );
#define int_proc int
#define proc_body {
#define proc_end }
#define no_args (void)
#include <stdio.h>
int_proc main no_args
proc_body
test "hello" end
proc_end
但是......真的吗?
C ++特别为运算符重载提供了更多可能性。如果你想“自定义”一些语法,你可能想要研究一下。
这是一个可怕的例子:
#include <iostream>
struct Foo {
void operator=(char const* str)
{
std::cout << str << std::endl;
}
};
Foo global_foo;
#define test global_foo =
int main()
{
test "hello";
}
请注意,您可能会发现有吸引力的方法,例如: Qt的qDebug
实用程序类。原理上,它是这样的:
#include <iostream>
struct debug {
debug() {}
~debug()
{
std::cout << std::endl;
}
debug const& operator<<(char const* msg) const
{
std::cout << msg << " ";
return *this;
}
};
使用它的常用方法是:
debug() << "this" << "works";
如果添加一个带char const*
的构造函数:
debug(char const*msg)
{
std::cout << msg << " ";
}
然后你可以使用演员表示法并写:
(debug) "Hello";
这与你所拥有的非常接近(并且是可以宏的)。
然后你可以看到所有其他运算符(operator,
将成为主要候选者),但优先规则可能会破坏一些乐趣。