Функция С, похоже, нигде не определена! - PullRequest
4 голосов
/ 10 апреля 2009

Я смотрю на исходный код vim, в частности файл normal.c , и вижу, что эта функция nv_operator используется, но она нигде не определена (я выбрал весь каталог src)

Это только объявлено как:

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

Я посмотрел определение __ARGS, но это просто ... ничего (почти)
в vim.h :

#define __ARGS(x) x

Так что же может происходить? Это какая-то техника C для создания фиктивной функции или что-то в этом роде?

Ответы [ 4 ]

11 голосов
/ 10 апреля 2009

Здесь присутствует определение:

/*
 * 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
2 голосов
/ 10 апреля 2009

Это просто прямое объявление , так что функция известна компилятору C (и может использоваться (вызываться из других функций)) до ее фактического определения (в строке 8247). Фактическое форматирование определения (которое включает переводы строки) затрудняет поиск его существования.

Не отвлекайтесь на макрос __ARGS. Это всего лишь макрос совместимости для различных синтаксисов объявления функций K & R C и ANSI C.

В ANSI C объявление функции должно выглядеть следующим образом:

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

У (старых) Кернигана и Ричи C http://en.wikipedia.org/wiki/C_(programming_language)#K.26R_C

int getopt ();

1 голос
/ 10 апреля 2009

Я не слишком уверен, что происходит, но вот несколько советов, которые помогут вам в вашем поиске:

Прежде всего, макрос __ARGS, похоже, присутствует, потому что могут быть версии C, в которых вы не должны включать аргументы в объявление функций (обратите внимание, что макрос определяется по-разному в зависимости от других символов препроцессора .. . комментарии говорят это).

Во-вторых, поиск функции nv_operator может оказаться недостаточно хорошим. Функция может быть сгенерирована макросами и тому подобным, поэтому вы не можете искать явное определение .... например, может быть префикс "nv" добавлен препроцессором.

Надеюсь, это поможет.

1 голос
/ 10 апреля 2009

Его трудно найти из-за его определения:

nv_operator (крышка)

появляется в строке отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...