3

当函数没有任何参数时,可以不带括号调用它defineas

#define test test()

是否可以使用不带括号的参数调用函数?就像是

#define test test(char *arg)

test "argument 1";
4

1 回答 1

13

这在 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,将是主要候选人),但优先规则可能会破坏乐趣。

于 2013-08-20T04:52:52.470 回答