Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C function seemingly not defined anywhere!

Tags:

c

vim

I'm looking at the vim source code, specifically the file normal.c, and I see this function nv_operator being used, but it's not defined anywhere (I grepped the entire src directory)

It's only declared as:

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

I've looked up the definition of __ARGS but it's just ... nothing (pretty much)
in vim.h:

#define __ARGS(x) x

So what could be going on? Is this some kind of C technique to create a dummy function or something?

like image 533
hasen Avatar asked Dec 08 '22 07:12

hasen


2 Answers

There is a definition present here:

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

That style of definition is using an identifier list for its parameters. The style is deprecated (obsolescent) but can still be used in C. The identifiers are named in the parameter list, and their type are named in declarations that immediately follow the function declarator but precede the functions body.

The __ARGS macro is there to handle compilers that don't know about prototypes for functions (the other form to declare parameters - with type and name combined directly in the function parameter list). It would then just emit no parameters at all in declarations, i think.

Update: See this code in 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
like image 195
Johannes Schaub - litb Avatar answered Dec 21 '22 23:12

Johannes Schaub - litb


It's simply a forward declaration, so that the function is known to the C compiler (and can be used (called from other functions)) before it's actually defined (in line 8247). The actual formatting of the definition (which includes newlines) makes it hard to grep for it's existence.

Don't get distracted by the __ARGS macro. It's only a compatibility macro for the different function declaration syntaxes of K&R C vs. ANSI C.

In ANSI C a function declaration must look like this:

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

In the (older) Kernighan and Ritchie C http://en.wikipedia.org/wiki/C_(programming_language)#K.26R_C

int getopt();

like image 35
lothar Avatar answered Dec 21 '22 22:12

lothar