2016-12-13 3 views
4

나는 C를 배우려고 노력 중이므로 일부 소스 코드를 읽으려고 시도했다.
는하지만이 말은 수도 무슨 생각이 없다 :인수가있는 함수로 배열?

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

첫 번째 부분은 함수로 보인다 static const char*이, 괜찮습니다, static이는 것을 의미한다 (유형 void의 인수가 있습니다) 이 파일에 표시되고 const char*은 값을 변경할 수 없지만 주소를 변경할 수 있음을 의미합니다.
하지만 (*const functab[]) 포함 functab라는 const를 배열이 대신 함수 이름의

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

의 경우와 같이이 경우, 그것은 함수 이름 다음에 마지막 부분 후에 이해가되지 않습니다 구애?
함수 ram 및 date가 포함 된 일종의 래핑 함수입니까? 배열을 선언하는 몇 가지 다른 방법?

+0

이 도움이 될 : HTTP : // cdecl.org/. – paulotorrens

+0

@paulotorrens 아니, 그 사이트는 아주 어리 석다. OP의 예에서 완벽하게 훌륭한 코드를 시도하면 "구문 오류"가 발생합니다. 나는 그들이 cdecl.org의 소스 코드에서 구문 오류를 참조한다고 가정합니다 ... – Lundin

+0

cdecl.org가 정적 키워드를 인식하지 못합니다. 얼마나 한심한가. – Lundin

답변

2

짧은 답변 : 토론 아래

는 함수 포인터의 배열의 좋은 예있다. 이것은 또한 "FUNCtion TABle"에서 가능성이있는 functab 이름을 설명합니다.

답 : C에서는 함수에 대한 포인터를 가져 와서 변수에 저장할 수 있습니다. 이 방식으로 사용되는 변수를 함수 포인터라고합니다. 이미 여기 ftype_t입니다 funcptr의 유형을 정의한 경우

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

이에만 작동합니다 :

는 예를 들어, 아래 funcptr 변수는 do_stuff의 진입 점의 주소를 포함합니다. 유형 정의는이 형태를 취한다 :

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

는 영어로,이 ftype_t가 유일한 인수로 const char*를 받아 int를 반환 함수의 유형으로 정의되는 것을 의미합니다.

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

이 작동하지만, 그 구문은 혼란 :

만 이에 대한 typedef 싶지 않은 경우

, 당신은 다음을 수행하여 같은 일을 달성 할 수 있었다. 또한 함수 포인터의 배열을 작성하는 것과 같은 일을 시도하면 코드가 실제로하는 것처럼 꽤 추해집니다. 아래 표시됨

이해하는 것이 훨씬 쉽다 해당하는 코드입니다 : (.의 & (주소) 일반적으로 선택하지만, 권장)

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

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

4

functabconst char*을 반환하고 인수를 허용하지 않는 함수 포인터 (정확히는 const 함수 포인터의 배열)의 배열입니다. 나중에

,

... = { ram, date }; 

어레이를위한 이니셜로서의 브레이스 둘러싸인 초기화리스트이다.

+0

명확히하기 위해, 다음과 같이해서는 안됩니다 :'functab'은 * 상수 * 함수 포인터의 배열입니다 ...? – babon

3

이것은 C에서 함수 포인터의 배열을 정의하는 방법입니다.이 배열을 사용하여 function을 ram()으로 호출하는 대신 (* functab[1])으로 호출 할 수 있습니다. 여기 functab 함수 포인터의 배열이며, 배열 기능 ramdate에 대한 포인터로 초기화된다 How can I use an array of function pointers?