在C中调用带参数但没有括号的函数?

时间:2013-08-20 01:37:11

标签: c function

当一个函数没有任何参数时,define可以不用括号调用它作为

#define test test()

是否可以在没有paranthesis的情况下调用带参数的函数?像

这样的东西
#define test test(char *arg)

test "argument 1";

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,将成为主要候选者),但优先规则可能会破坏一些乐趣。