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

时间:2009-04-10 00:58:21

标签: c vim

我正在查看vim源代码,特别是文件normal.c,我看到这个函数nv_operator正在使用,但它没有在任何地方定义(我在整个src目录中插入)

它只被声明为:

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

我查了__ARGS的定义,但它只是......没什么(差不多)
vim.h中:

#define __ARGS(x) x

那么可能会发生什么?这是某种C技术来创建虚拟函数吗?

4 个答案:

答案 0 :(得分:11)

这里有一个定义:

/*
 * 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

答案 1 :(得分:2)

它只是一个forward declaration,因此该函数在C编译器已知(并且可以在实际定义之前使用(从其他函数调用))(在第8247行)。该定义的实际格式(包括换行符)使得很难对它的存在进行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();

答案 2 :(得分:1)

由于其定义如何很难找到:

nv_operator(帽)

单独出现在一条线上。

答案 3 :(得分:1)

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

首先,__ARGS宏似乎存在,因为可能存在C的版本,你不应该在函数声明中包含args(请注意,宏的定义取决于其他预处理器符号。评论说它。)

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

希望这有帮助。