将C函数在C标准库中定义为宏

时间:2017-10-31 07:00:15

标签: c posix c-standard-library

我一直在阅读C组头上的Open Group Base规范和Posix Programmers手册页,这个短语重新出现了很多"以下内容将被声明为函数,也可能被定义为宏"而且我不确定这意味着什么。从声明的函数创建宏有什么意义。不会只是创建名称空间冲突吗?你也为什么要这样做呢?

1 个答案:

答案 0 :(得分:0)

标准库中的函数必须作为函数存在,因为即使您没有#include任何标准头文件也可以使用它们。也就是说,链接器必须能够找到该函数,并且您可以自己插入声明,只要它是正确的声明并且您不包含声明该函数的任何标头。

但是,某些功能可以更有效地实现为宏。 (putcisdigit是两个常见示例。)如果是这种情况,则实现可以通过自由地利用它,包括有效的宏定义。

宏名称和函数在C中不在同一名称空间中,因此不会产生冲突。宏将在使用函数的地方展开,这意味着通常不会使用外部函数,但有两种重要的方式将符号定义为"类似函数"宏不会进行宏扩展:

  • 如果符号在宏定义中使用,因为C不允许递归宏扩展。这对于公共调用案例可以是宏的函数很有用,使用库函数作为后备。 (例如,ctype函数可以定义为宏,如果当前语言环境不是C语言环境,则调用该函数。

  • 如果使用宏名称而没有带括号的参数列表。这允许您获取函数的地址,即使它具有宏实现。您(或标准库)可以使用冗余括号强制使用函数而不是宏:(isdigit)(my_char)