当函数没有任何参数时,可以不带括号调用它define
as
#define test test()
是否可以使用不带括号的参数调用函数?就像是
#define test test(char *arg)
test "argument 1";
这在 C 语言中是不可能的。标准(C99)的第 6.5.2 节描述了后缀表达式,并且没有类似的语法。函数调用是(§6.5.2.2):
后缀表达式后跟
()
包含可能为空的逗号分隔的表达式列表的括号是函数调用。后缀表达式表示被调用的函数。表达式列表指定函数的参数。
括号不是可选的,它们需要包装所有参数,因此您需要一个类似函数的宏(在“调用”站点需要括号)或两个单独的东西(一个插入起始括号,一个插入结束一)。
你可以这样做:
#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,
将是主要候选人),但优先规则可能会破坏乐趣。