2014-05-20 5 views
0

저는 building my own Lisp에 의해 C를 배우고 있습니다. 내 함수 포인터 builtin_def이 선언되지 않았다면 컴파일러는 왜 불평하지 않습니까? 그리고 어떻게 수행합니까? 컴파일러는 매개 변수로 전달되는 변수의 유형을 알고 있습니까? 나는이 같은 builtin_def의 선언이없는컴파일러는 어떻게 함수 포인터의 변수 유형을 알고 있습니까

// function pointer 
typedef lval*(*lbuiltin)(lenv*, lval*); 

lval* builtin_def(lenv* e, lval* a){ 
    return lval_sexpr(); 
} 

void lenv_add_builtins(lenv* e){ 
    lenv_add_builtin(e, "def", builtin_def); // builtin_def not declared 
} 

int main(int argc, char** argv){ 
    lenv* e = lenv_new(); // constructor 
    lenv_add_builtins(e) 
    return 0; 
} 

주의 사항 :

lenv*(*builtin_def)(lenv*, lval*); 
+3

위의 세 줄을'builtin_def '로 선언하십시오. (그리고 당신은 동시에 그것을 정의 할 수도 있습니다.) – Mat

+0

예,하지만 그것은 함수이고 포인터가 아닌 것입니다. – Pompeyo

+2

함수의 맨 이름은 * 함수 포인터입니다. 'builtin_def'는 함수 포인터입니다. 반면에'builtin_def (e, a)'는 함수 호출입니다. –

답변

2

당신은 위의 builtin_def 몇 줄을 선언한다. 기능 지정자 기능 유형이 표현입니다

(C99 §6.3.2.1) : 그리고 당신은 자동 변환이 포인터 기능을 얻을. 그것은 sizeof 연산자 피연산자의 _Alignof 운영자 또는 단항 & 연산자 가 작동 '포인터 입력이 있는지 표현으로 변환된다'기능 유형을 리턴 '유형의 함수 부호 인 경우를 제외 반환 유형 ''.

그래도 문제가 없습니다.

관련 문제