为了公共记录的缘故,我在 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 函数定义为宏供参考。
如果那些人说功能命名与标准不同
名称与标准中指定的名称不同的函数与标准无关(只要它们满足标准的一般要求)。