2016-10-26 6 views
3

Я видел часть кода в одном из старых файлов.Функция Объявление указателя функции и определение функции вместе

void (*const m_exec[N_EXECS])(void) = 
    { 
     #define PROCESS_DEF_TIMED(name) name, // defines macro for use in proclist.h 
     #define PROCESS_TIMED     // define switch for section in proclist.h 
     #include "proclist.h" 
     #undef PROCESS_TIMED     // undefine switch 
     #undef PROCESS_DEF_TIMED    // undefines macro 
    }; 

Я не могу понять значение этого кода. Является ли это указателем на функцию с определением объявления и определения функции вместе? Но если я пытаюсь объявить подобный указатель функции, как показано ниже, я получаю ошибку компиляции

void (*voidFptr)(void) = 
{ 
    printf("Hello\n"); 
} 

Кроме того, что #define здесь? Почему это внутри функции, я не уверен.

+2

Он заполняет массив указателей функций из списка, содержащегося в '' proclist.h''. –

+0

Запустите файл через препроцессор и посмотрите на предварительно обработанный вывод. –

+0

Вы просмотрели файл заголовка? Возможно, вы также заметили, что синтаксис оригинала отличается от вашего. В программном коде каждый персонаж важен, часто даже в комментариях и строковых литералах. – Olaf

ответ

7

Это:

void (*const m_exec[N_EXECS])(void) 

путь вы объявить массив указателей на функции в C. Вы не одиноки в поиске это трудно читать. Он объявляет массив длиной N_EXECS, где каждый элемент в массиве является функцией, которая не принимает аргументов и возвращает указатель на const-void.

Блок, заключенный в фигурные скобки, после него является инициализатором массива; вероятно, proclist.h имеет целый список объявлений указателей функций в нем, и это по существу вставляет их в этот массив. Если вы хотите увидеть, что происходит на самом деле после #include, вы можете использовать флаг вашего компилятора -E. Так что, если бы это было в main.c, вы должны запускать:

gcc -E -Ipath/to/headers -Iother/path/to/headers main.c 

И это даст вам (возможно огромный) дамп исходного кода, который является результатом толкая этот файл через препроцессор и оценить все #include заявления.

Редактировать: пропустил последний вопрос.

Возможно (и это догадка, не видя proclist.h), вещи, определяющие его значение, изменяют содержание proclist.h. Например, если в нем содержится:

#ifdef PROCESS_TIMED 
&function1_timed, 
&function2_timed 
#else 
&function1, 
&function2 
#endif 

Тогда #define PROCESS_TIMED бы изменить то, что в конечном итоге в вашем m_exec массиве.

+0

Можем ли мы объявить указатель на функцию и определить функцию вместе с чем-то вроде «void (* voidFptr) (void) = { printf (« Hello \ n »); } ' – Rajesh

+0

Определяя функцию, вы по существу «объявляете указатель на функцию»; если у вас есть void voidf (void) {printf ("Hello \ n"); } ', то' voidf' и '& voidf' являются эквивалентными и действительными указателями функций. –

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

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