【问题标题】:What C syntax the code is using?代码使用什么 C 语法?
【发布时间】:2012-02-24 06:56:55
【问题描述】:
local uLong unzlocal_SearchCentralDir OF((
    const zlib_filefunc_def* pzlib_filefunc_def,
    voidpf filestream));

local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream)
    const zlib_filefunc_def* pzlib_filefunc_def;
    voidpf filestream;
{

...其余的来源。

以上C源码来自unzip.c。

我想知道函数原型行的语法是什么? 尤其是关键的“OF”是从哪里来的,或者它是干什么用的?

【问题讨论】:

  • OF 可能是一个宏,它在非常旧的编译器上删除了原型。

标签: c function syntax prototype


【解决方案1】:

搜索行的标题:

#define OF(x) ...

在这里,x... 可能是别的东西。 OF 不是关键字,而是宏。来自"zconf.h"

#ifndef OF /* function prototypes */
#  ifdef STDC
#    define OF(args)  args
#  else
#    define OF(args)  ()
#  endif
#endif

这用于允许相同的代码在 ANSI C 编译器(1989 或更新版本)和 pre-ANSI C 编译器(1989 之前)上编译。我们不再关心那么旧的编译器,但是 zlib 已经存在了很长时间(自 1995 年以来)并且他们还没有放弃对旧编译器的支持。您会在 LibPNG 中找到类似的定义。

在 1995 年,DOS 在桌面上仍然相当普遍。现在这样编程已经没有用了。

【讨论】:

    【解决方案2】:

    该代码中有两个有趣的东西是 localOF

    local 这个词在gzguts.h 中默认是#defined 到static。评论解释了原因:

    #ifndef local
    #  define local static
    #endif
    /* compile with -Dlocal if your debugger can't find static symbols */
    

    因此我们推断,在过去的某个时间点,有人不得不使用不能很好地处理静态函数的调试器。您可以使用所有全局函数编译 zlib 来解决该问题。

    OF 这个词在zconf.h 中是#defined:

    #ifndef OF /* function prototypes */
    #  ifdef STDC
    #    define OF(args)  args
    #  else
    #    define OF(args)  ()
    #  endif
    #endif
    

    此定义允许使用不支持函数原型的 pre-ANSI 标准编译器编译 zlib。在 ANSI C 之前,函数声明必须如下所示:

    uLong unzlocal_SearchCentralDir();
    

    无论函数采用什么参数。该宏允许使用原型参数列表声明函数,但如果编译器不支持 ANSI C,参数列表将被省略。

    【讨论】:

      【解决方案3】:

      它已经过宏化,可以在多个编译器上成功运行。

      local 在大多数平台上无疑是#define local static

      OF 在大多数现代编译器上保持参数不变,但使用旧的 K&R-only 样式参数,它会将unzlocal_SearchCentralDir OF(const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream) 重构为

         unzlocal_SearchCentralDir (pzlib_filefunc_def, filestream)
            const zlib_filefunc_def* pzlib_filefunc_def;
            voidpf filestream;
         {  // begin function body...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-25
        • 1970-01-01
        • 1970-01-01
        • 2020-01-28
        相关资源
        最近更新 更多