iowin32.h中的OF宏

10

我无法理解来自minizip的iowin32.h文件中的以下一行:

void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));

(源代码,虽然过时但仍然相关)

OF宏的作用是什么?


追溯包含的头文件(来自iowin32.c),最终你会到达OF()的定义(它在zlib的zconf.h中)。但是我无法解释它的作用。 - tinman
我认为这是为旧的C(K&R) C编译器设计的,这些编译器不使用/支持函数声明。 - user786653
1个回答

12

名字OF可能是旧函数声明(Old function declaration)的缩写。

在80年代甚至更早的时候,这个函数的典型声明看起来像这样:

fill_win32_filefunc();

就这样了。没有明确的返回类型,也没有声明的参数。默认的返回类型是int,而参数并不重要,因为调用者会(希望如此)传入正确数据类型的值。

后来的版本引入了void类型,所以声明可能看起来像这样:

void fill_win32_filefunc();

在ANSI C89发布时,它引入了函数参数的声明。现在,一个好的声明看起来是这样的:

void fill_win32_filefunc(zlib_filefunc_def* pzlib_filefunc_def);
在1989年之后的早期,有很多需要结合这两种风格的代码。因此,一种名为OF的宏(有时也称为_P或其他名称)被发明出来。它通常的定义是:
#if PRE_ANSI_C89
#  define OF(args) ()
#else
#  define OF(args) args
#endif

从那时起,两个版本都很容易生成。

现在,这种技巧已不再需要,除了非常古老的编译器之外。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接