function 인자 받는 문제입니다
글쓴이: bucketquai / 작성시간: 목, 2003/05/22 - 1:09오후
우선 예를들어 GDBM의 open function의 proto type을 보면
extern GDBM_FILE gdbm_open GDBM_Proto(( char *file, int block_size, int flags, int mode, void (*fatal_func)() ));
이런데요 실제로 매뉴얼을 보면 fatal_func의 인자로 char*값이 하나 넘어간다고 되어 있습니다. 그래서 실제로
void err_func(char *str) { printf("<b>DB Error</b>: %s", str); exit(1); } dbf = gdbm_open(filename, 512, flag, 0666, err_func);
라고 코딩을 하면 str을 잘받아서 찍어줍니다
그런데 vc에서는 워닝도 아닌 에러가 나더군요
에러메시지는 다음과 같습니다
error C2664: 'gdbm_open' : cannot convert parameter 5 from 'void (char *)' to 'void (__cdecl *)(void)' None of the functions with this name in scope match the target type
아무래도 선언부분의 void (*fatal_func)() 가 void (*fatal_func)(char *)가 되어야 할것같은데 이상한게 gcc에서는 -Wall 에서 워닝도 안나오더군요
질문을 정리해보면
1.prototype이 잘못되어 있고 gcc -Wall 에서는 워닝이 나오지 않는다
2.prototype은 올바른데 vc의 문제(?) 이다
1번이거나 2번인것 같은데(아닐지도 --; ) 아시는분 계시면 조언좀 부탁드리겠습니다 (_ _)
ps.혹시 캐스팅을 해야한다면 어떻게 해야 할까요?
Forums:
어떻게 보면 gcc, vc 문제보다 c, c++ 의 문제로 보는 것이 나
어떻게 보면 gcc, vc 문제보다 c, c++ 의 문제로 보는 것이 나을것 갑습니다.
c++ 같은 경우 타입에 따라서 전혀 다른 코드가 실행 될 수도 있으므로 타입이 항상 명시적이어야 하고, 따라서 위와 같은 경우 에러를 발생합니다.
정말 그렇군요
g++로 해보니 정말 그렇군요 :)
그런데 타입캐스팅 부분이 function이 관련되니까 상당히 난해하네요
윗부분의 문제뿐아니라 다음과 같은 경우에는 어떻게 캐스팅을 해야 할까요?
c에서는 이렇게 코딩하고 있었는데 c++에서는 어떻게 캐스팅을 해야 할까요?
이부분이 문제겠죠?
좀 알려주시면 감사하겠습니다 ( _ _ )
Re: 정말 그렇군요
c에서는
void func(char *str);
void func2(char *str1, char *str2);
void (*fp)();
이렇게 쓴다면
c++에서는
그냥 overloading이 되니깐
void func(char *str);
void func(char *str1, char *str2);
이렇게 해놓고
func("first");
func("first", "second");
요렇게 쓰면 되잖아요.
아 그렇군요 - -;
아 네 맞습니다 제가 예를 잘못 들었네요 - -;;;;;;
답변은 감사한데요 제가 궁금한건 funtion 변수에서 타입캐스팅 부분이라서요
타입 캐스팅으로 보여주실수 없을까요 - -a
올리신 소스가 c++ 에서 컴파일되게 해본다면..[code:1]i
올리신 소스가 c++ 에서 컴파일되게 해본다면..
이런식으로 캐스팅하면 됩니다.
댓글 달기