2016-10-26 4 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 
    }; 

이 코드의 의미를 이해할 수 없습니다. 선언과 함수 정의가 함께있는 함수 포인터입니까? 나는 다음과 같은 유사한 함수 포인터를 선언하려고하면, 나는 또한 #DEFINE 여기에 무엇을 컴파일 오류

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

를 얻을? 이것이 내가 잘 모르는 기능 안에있는 이유는 무엇입니까?

+2

''proclist.h ''에 들어있는 목록에서 함수 포인터 배열을 채우고 있습니다. –

+0

전 처리기를 통해 파일을 실행하고 전처리 된 출력을보십시오. –

+0

헤더 파일을 보셨습니까? 어쩌면 원래 구문과 구문이 다르다는 것을 알 수 있습니다. 프로그램 코드에서 모든 단일 문자는 중요하며 주석 및 문자열 리터럴에서도 중요합니다. – Olaf

답변

7

이 :

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

당신은 읽기이 어려운 찾는 혼자가 아니라 당신이 C에서 함수 포인터의 배열을 선언하는 방법입니다. 이 코드는 길이가 N_EXECS 인 배열을 선언하며, 배열의 각 요소는 인수를 사용하지 않고 const-void에 대한 포인터를 반환하는 함수입니다.

배열 중괄호 뒤에 오는 중괄호로 묶은 블록. 아마도 proclist.h에는 함수 포인터 선언의 전체 목록이 있으며,이 배열을 본질적으로이 배열에 붙여 넣습니다. 실제로 #include 이후에 어떤 현상이 나타나는지보고 싶다면 컴파일러의 -E 플래그를 사용할 수 있습니다.

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

그리고 그것은 당신에게 #include의 모든 프리 프로세서를 통해 해당 파일을 밀고 평가의 결과가 소스 코드의 (아마도 거대한) 덤프를 줄 것이다 :이 main.c에있는 것처럼 그래서, 당신은 실행됩니다 진술.

편집 : 마지막 질문을 놓쳤습니다.

아마도 (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'는 동등하고 유효한 함수 포인터입니다. –