如何解释“函数……也可以定义为宏”?

如何解释“函数……也可以定义为宏”?

为了公共记录的缘故,我在 SE 询问,而不是在标准化邮件列表上询问,以便人们更容易访问。

几乎每个指定函数(或类似函数的接口)的标头都有以下内容:

以下应声明为函数,也可以定义为宏。应提供功能原型。

这让我很困扰,因为它可能意味着某些人功能我使用的可能无法分配给函数指针,因为它们可能被定义为

然而,第二部分(“应提供原型”)似乎表明,如果那些说功能的命名与标准所说的不同,那么不同的名称必须有一个相同的原型(或至少在每个可列举的方面兼容)与标准中指定的内容。

我的解释正确吗?如果不是,真正的解释是什么?我可以将该段下面列出的接口分配给函数指针吗?

答案1

以下应声明为函数,也可以定义为宏。

并不意味着如果函数也被定义为宏,则不能再引用它们。

考虑isalnum,它通常是一个宏:

#include <ctype.h>
#include <stdio.h>

int main(int argc, char **argv) {
  printf("%p\n", isalnum);
  printf("%d\n", isalnum('C'));
}

在当今的 C 中,第一个isalnum引用不能是宏:当isalnum是宏时,它被声明为isalnum(c)或等效的,因此无参数引用不匹配。第二个引用可以是宏或函数(您可以通过将代码传递给预处理器来查看是哪个);如果你想确保后者,你可以#undef酌情使用括号((isalnum)('C'))。

C 标准中该语句背后的实际要求是,以这种方式引入的函数必须始终可用作实际函数,即使它们(也)定义为宏。

应提供功能原型。

原型是一个不同的关注点;那里的要求是,而不是简单的

extern int isalnum();

声明时,头文件提供完整的原型以及所有参数的类型信息。

将 C 标准库中的 C 函数定义为宏供参考。

如果那些人说功能命名与标准不同

名称与标准中指定的名称不同的函数与标准无关(只要它们满足标准的一般要求)。

相关内容