2015-12-07 6 views
1

Может ли кто-нибудь предложить мне, для чего стоит нижняя строка кода?Как понять такое объявление функции?

static int(*pfcn[2]) (char *, ...) = { (void *)printf, (void *)NULL }; 
+0

@milevyo - почему так? – artm

+0

Инициализатор должен быть постоянным; это не постоянный инициализатор. – milevyo

+0

Извините, я не прочитал его правильно. :) – milevyo

ответ

5

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 для обнаружения конца. Избегать отливок - это хорошо.

+0

Этот сайт не очень приятен, поскольку он терпит неудачу в списке аргументов переменных при попытке: [см. Это] (http://cdecl.ridiculousfish.com/?q=int%28*pfcn [2]% 29 +% 28char + *% 2C + ...% 29). – Lundin

+0

@ Lundin Согласитесь, следовательно, ласковые слова «помогают». Не так уж плохо для бесплатного сайта. – chux

+2

Btw вы можете конвертировать между нулевыми указателями и указателями функций, это четкое поведение. Однако в стандарте C вы не можете конвертировать между указателями функций и регулярными указателями (например, 'void *' в вопросе). – Lundin

4

pfcn представляет собой массив указателей на функции.

Функции - это те, которые принимают переменное количество аргументов при возврате int.

1

Это (трудно читаемое) определение массива из двух функций. Я бы написал это примерно так:

#include <stdio.h> 
#include <stdlib.h> 

typedef int (*Function)(const char *format, ...); 

static Function pfcn[2] = {printf, NULL}; 

Точки означают, что функция будет принимать ноль или более аргументов после первого.

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