2016-12-13 16 views
4

Я пытаюсь изучить c, поэтому я попытался прочитать некоторый исходный код.
Но я понятия не имею, что это может означать:Array как функция с аргументами?

static const char*(*const functab[])(void)={ 
     ram,date 
}; 

Первая часть, static const char* прекрасно, как кажется, является функцией (имеет аргумент типа void), static должно означать, что только видимый в этом файле, и const char* должен означать, что значение не может быть изменено, но адрес может быть изменен.
Но в этом случае, это не имеет смысла после последней части после имени функции, как это было в случае с

static const char * date(void); 
static const char * ram(void); 

Вместо имени функции есть (*const functab[]), константный массив называется functab содержащего адреса?
Это какая-то функция обертывания, содержащая функции ram и date? Какой-то альтернативный способ объявления массивов?

+0

Это может помочь: HTTP: // cdecl.org/. – paulotorrens

+0

@paulotorrens Нет, это не так, этот сайт довольно глуп. Попробуйте совершенно тонкий код в примере OP, и вы получите «синтаксическую ошибку». Я предполагаю, что они ссылаются на синтаксическую ошибку в исходном коде cdecl.org ... – Lundin

+0

Оказывается, cdecl.org не распознает статическое ключевое слово. Как жалко. – Lundin

ответ

2

Короткий ответ: Здесь functab представляет собой массив указателей на функции, а массив инициализируется с указателями на функции ram и date. Это также объясняет имя functab, которое, вероятно, относится к «FUNCTION TABLE».

Длинный ответ: на C вы можете получить указатель на функцию и сохранить ее в переменной. Переменная, используемая таким образом, называется указателем функции.

Например, funcptr переменная ниже будет содержать адрес точки входа do_stuff «s:

int do_stuff(const char* x) { ...do stuff.. } 
... 
ftype_t funcptr = &do_stuff; 
... 
(*funcptr)("now"); // calls do_stuff() 

Это будет работать только если вы уже определили тип funcptr, который ftype_t здесь. Определение типа следует принимать эту форму:

typedef int (*ftype_t)(const char*); 

В английском языке это означает, что ftype_t в настоящее время определяются как тип функции, которая принимает const char* в качестве единственного аргумента и возвращает int.

Если вы не хотите typedef только для этого, вы могли бы достичь то же самое, выполнив ниже:

int (*funcptr)(const char*) = &do_stuff; 

Это работает, но его синтаксис сбивает с толку. Также он становится довольно уродливым, если вы пытаетесь сделать что-то вроде построения массива указателей функций, что и делает ваш код.

Ниже показан эквивалентный код, который гораздо легче понять: (. & (адрес), как правило, необязательно, но рекомендуется)

typedef static const char*(*myfn_t)(void); 

const myfn_t functab[] = { &ram, &date }; 

4

functab - массив указателей функций (массив const указателей функций, если быть точным), который возвращает const char* и не принимает аргументов.

Позже

... = { ram, date }; 

является скобка-закрытый список инициализатор, который служит в качестве инициализатора для массива.

+0

Просто уточнить, не должно ли это быть: 'functab' is и array of * constant * указатели на функции ...? – babon

3

Это способ определения массива указателей функций в C. Поэтому вместо вызова функции как ram(), используя этот массив, вы можете назвать его (* functab[1]).

Ниже обсуждения хорошие примеры массива указателя функции: How can I use an array of function pointers?

 Смежные вопросы

  • Нет связанных вопросов^_^