0%

仅扩展为其参数的PROTOTYPE宏有什么意义?

❓ 我有一个头文件,其中包含

1
#define PROTOTYPE(s)

这有什么意义呢?似乎它将只是用自身替换输入。使用方法如下:

1
2
3
4
CS_RETCODE clientmsg_callback PROTOTYPE((
CS_CONTEXT * context,
CS_CONNECTION *connection,
CS_CLIENTMSG *clientmsg));

这是使用Sybase Open Client的项目的一部分。稍后在此处使用clientmsg_callback:

1
2
ct_callback(context, NULL, CS_SET, CS_CLIENTMSG_CB,
(CS_VOID *)clientmsg_callback);

✔️ C语言早期,没有原型这样的东西。函数参数列表位于函数的括号之后,如下所示:

1
2
3
4
5
6
square(x)
int x;
{
int y = x * x;
return y;
}

当然,参数放在括号内:

1
2
3
4
5
square(int x)
{
int y = x * x;
return y;
}

注意“missing”返回类型; C函数曾经隐式地返回int,只有在您需要其他返回类型时,才必须说出它是什么。

函数声明还有另一套规则。K&R C (the ancient version)中的函数声明没有参数:

1
int square();

ANSI C中的函数原型具有参数列表:

1
int square(int x);

在过渡期间,人们使用了古怪的宏,因此他们可以两种方式进行编译:

1
int square(PROTOTYPE(int x));

和它一起使用将扩展到第一个版本

1
#define PROTOTYPE(s)

和它一起使用将扩展到第二个版本

1
#define PROTOTYPE(s) s

关于问题代码中的“额外”括号,当参数列表中有多个参数时,需要使用它们。没有它们,宏调用将具有多个参数,因此不会与仅具有一个参数定义的宏匹配:

1
2
PROTOTYPE(int x, int y)   // error: too many arguments
PROTOTYPE((int x, int y)) // ok: only one argument (enclosed in parentheses)