갯수가 정해지지 않은 함수의 파라메터 넘기기
글쓴이: macmac83638 / 작성시간: 목, 2003/11/13 - 1:57오후
예를 들어 printf(char* format, ...) 과 같은 것이 있고..
제가 myPrintf(int mode, char* format, ...) 라는 것을 만들어서
myPrintf(int mode, char* format, ...) { if (mode > currentMode) { printf(format, ...); <- 위의 파라메터를 그대로 넘기고 싶습니다. } }
이렇게 하고 싶은데.. va_list나 va_start를 꼭 써야 가능한건지요 ?
만일 그렇다면 어떻게 해야 하는지 알고 싶습니다만..
Forums:
네 va_list를 사용해야하며, vprintf 를 호출하시면 됩니다.
네 va_list를 사용해야하며, vprintf 를 호출하시면 됩니다.
---
http://coolengineer.com
문제는..
호출될 함수가 printf가 아니구요..
다른 사용자가 정의한 함수인데, 그 함수 내부를 손댈수는 없고
역시 파라메터를 char* format, ... 형태로 넘겨야 해서..
이 경우에 va_list를 넘겨도 상관이 없는건가요 ?
Freedom is Just Another Word for Nothing Left to Lose
아니요... 그렇지 않습니다.그 함수가 va_list 버전을 제공
아니요... 그렇지 않습니다.
그 함수가 va_list 버전을 제공하지 않으면 힘들것 같은데요...
---
http://coolengineer.com
갯수가 정해지지 않앗다라....그갯수가 그리 많지 않다면. 좀 지
갯수가 정해지지 않앗다라....
그갯수가 그리 많지 않다면. 좀 지저분하게 하는 방법이있습니다...
myPrintf(int mode, char* format, ...)
...을.. void* a=NULL, void* b=NUL, void* c=NULL로 정의하시면 가능합니다..
일단 넘기는것만은요... 인자수가 설정된 파라미터 수보다 적더라도 NULL
디폴트기 때문에 없으면 NULL로 처리됩니다.. 유의하시고요..
printf같은 성격으로 사용하시려면.. myprint를 직접 구현하셔야겠죠..
어떤식으로 구현하실지몰라서 그냥 저렇게 꽁수로 할수도있다는 잡생각이
들어서 끄적여 봅니다.. 물론 거의 사용하지 않습니다 지저분해서 -_- ;;;
다른방법 깔끔한 방법은 위님이 적으신데로 입니다..
그럼...~
' 형식이 내용을 규정한다. '
va_list..
pynoos님이 말씀하신데로 va_list 와 v~계열의 printf 를 쓰시면
가능합니다. 물론 myPrintf(...) 만들어서 모듈화 하는 것도 가능합니다.
다음은 간단한 예제를 만들어 봤습니다..
대략 도움이 되었길.
va_list 를 인자로 받는 함수 없이 생략형만 제공하는 API 가 있
va_list 를 인자로 받는 함수 없이 생략형만 제공하는 API 가 있을 때는..
그 사이에 어떤 wrapper를 만든다는 것은 사실 이론상 피해야합니다.
그 wrapper를 호출했을 때의 stack에 쌓인 인자의 개수를 알 수 없기 때문에,
wrapper안에서 원 함수를 호출할 수 없기 때문입니다.
가능한 방법을 찾는다면 그것은 그 컴파일러만을 위한 꽁수로 나올 수 밖에 없습니다.
원 소스 저작자에게 v~계열을 만들어 달라고 하시는 것이 좋을 것 같습니다.
---
http://coolengineer.com
네. 감사합니다.
네. 감사합니다.
Freedom is Just Another Word for Nothing Left to Lose
매크로는 어떤가요?[code:1]#define myPrintf&#
매크로는 어떤가요?
근데, gcc 컴파일러에서만 먹히더군요... 다른 컴파일러에서는 곤란하구요...^^
VC에서도 됩니다.
VC에서도 됩니다. 한 6년전쯤에 확실히 됐었는데... 지금은 안될지도...8)
토큰 붙여주는 거는 ANSI C 표준 이었던 것같기도 하고... 아닌것 같기도 하고... ^^;
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
Re: VC에서도 됩니다.
표준이 맞습니다. 그런데 c99 표준입니다.
덕분에 지원 못하는 컴파일러들이 있습니다.
저도 이걸 사용하다가 AIX 4.3.3에서 xlc 컴파일러 사용했다가
다시 다 뜯어고친 경험이 있네요.
참고하시기 바랍니다.
Re: VC에서도 됩니다.
이것은 표준이 아니라 gcc의 확장입니다. C99 표준에 따른다면
로 해야 합니다.
댓글 달기