Может ли кто-нибудь предложить мне, для чего стоит нижняя строка кода?Как понять такое объявление функции?
static int(*pfcn[2]) (char *, ...) = { (void *)printf, (void *)NULL };
Может ли кто-нибудь предложить мне, для чего стоит нижняя строка кода?Как понять такое объявление функции?
static int(*pfcn[2]) (char *, ...) = { (void *)printf, (void *)NULL };
C gibberish ↔ English хороший сайт, который помогает объяснить заявления
// declare pfcn as array 2 of pointer to function (pointer to char, ...) returning int
int(*pfcn[2]) (char *, ...)
{ (void *)printf, (void *)NULL };
инициализирует этот массив с помощью функции printf()
, а затем NULL
, вероятно, чтобы указать конец.
int printf(const char *format, ...)
NULL
static
означает, что массив является локальным и доступен только для файла функции/C оно находится.
@Lundin рекомендует, который компилирует хорошо.
// { printf, (void *) NULL };
{ printf, NULL };
ИМО, а также декларация должна быть
// const added
static int(*pfcn[2]) (const char *, ...) = { printf, NULL };
Примечание: Некоторые C не могут позволить литья NULL
на функцию указатель на. В этом случае код может использовать
static int printf_null(const char *format, ...) {
return 0;
}
static int(*pfcn[2]) (const char *, ...) = { printf, printf_null };
... и тест против printf_null
, а не NULL
для обнаружения конца. Избегать отливок - это хорошо.
Этот сайт не очень приятен, поскольку он терпит неудачу в списке аргументов переменных при попытке: [см. Это] (http://cdecl.ridiculousfish.com/?q=int%28*pfcn [2]% 29 +% 28char + *% 2C + ...% 29). – Lundin
@ Lundin Согласитесь, следовательно, ласковые слова «помогают». Не так уж плохо для бесплатного сайта. – chux
Btw вы можете конвертировать между нулевыми указателями и указателями функций, это четкое поведение. Однако в стандарте C вы не можете конвертировать между указателями функций и регулярными указателями (например, 'void *' в вопросе). – Lundin
pfcn
представляет собой массив указателей на функции.
Функции - это те, которые принимают переменное количество аргументов при возврате int
.
Это (трудно читаемое) определение массива из двух функций. Я бы написал это примерно так:
#include <stdio.h>
#include <stdlib.h>
typedef int (*Function)(const char *format, ...);
static Function pfcn[2] = {printf, NULL};
Точки означают, что функция будет принимать ноль или более аргументов после первого.
@milevyo - почему так? – artm
Инициализатор должен быть постоянным; это не постоянный инициализатор. – milevyo
Извините, я не прочитал его правильно. :) – milevyo