代码之家  ›  专栏  ›  技术社区  ›  hasen

C函数似乎在任何地方都没有定义!

vim c
  •  4
  • hasen  · 技术社区  · 15 年前

    我在看VIM源代码,特别是文件 normal.c ,我看到这个函数 nv_operator 正在使用,但它没有在任何地方定义(我对整个SRC目录进行了grepped)

    仅声明为:

    static void nv_operator __ARGS((cmdarg_T *cap));
    

    我查过“args”的定义,但只是…没什么(差不多)
    在里面 vim.h :

    #define __ARGS(x) x
    

    那么会发生什么呢?这是某种 C 创建虚拟函数或其他东西的技术?

    4 回复  |  直到 15 年前
        1
  •  1
  •   ojblass    15 年前

    很难找到,因为它是如何定义的:

    nv_运算符(cap)

    单独出现在一行上。

        2
  •  11
  •   Johannes Schaub - litb    15 年前

    这里有一个定义:

    /*
     * Handle an operator command.
     * The actual work is done by do_pending_operator().
     */
        static void
    nv_operator(cap)
        cmdarg_T    *cap;
    ....
    

    这种类型的定义使用标识符列表作为参数。样式已弃用(过时),但仍可以在C中使用。标识符在参数列表中命名,其类型在紧接函数声明符之后但在函数体之前的声明中命名。

    这个 __ARGS 宏用于处理不知道函数原型的编译器(声明参数的另一种形式-使用类型 名称直接组合在函数参数列表中)。然后它将在声明中根本不发出任何参数,我想。

    更新:请参见 vim.h :

    #if defined(MACOS) && (defined(__MRC__) || defined(__SC__))
       /* Apple's Compilers support prototypes */
    # define __ARGS(x) x
    #endif
    #ifndef __ARGS
    # if defined(__STDC__) || defined(__GNUC__) || defined(WIN3264)
    #  define __ARGS(x) x
    # else
    #  define __ARGS(x) ()
    # endif
    #endif
    
        3
  •  2
  •   lothar    15 年前

    它只是一个 forward declaration ,以便在实际定义函数之前(在第8247行中),C编译器知道该函数(并且可以使用(从其他函数调用))。定义的实际格式(包括换行符)使得它的存在很难grep。

    不要被“args”宏分散注意力。它只是k&r c与ansi c的不同函数声明语法的兼容宏。

    ANSI C 函数声明必须如下所示:

    int getopt(int,char*const*,const char*);

    在(老的)Kernighan和Ritchie C http://en.wikipedia.org/wiki/C_(programming_language)#K.26R_C

    int GETopt();

        4
  •  1
  •   Tom    15 年前

    我不太确定发生了什么,但这里有一些提示可以帮助您进行搜索:

    首先,args宏似乎在那里,因为可能有C的版本,您不应该在函数声明中包含args(注意,根据其他预处理器符号,宏的定义不同…。评论说的)。

    其次,搜索函数nv_运算符可能不够好。函数可能是由宏等生成的,因此无法搜索显式定义….例如,预处理器可能会添加“nv”前缀。

    希望这有帮助。