리턴형이 char * 아니면 void ?
글쓴이: gogisnim / 작성시간: 일, 2007/04/08 - 10:42오후
string.h 에 있는 str~ 류의 함수들 리턴형이 char * 인것이 많습니다.
strcpy 같은 경우 char *strcpy(char *dest, const char *src); 인것처럼요.
어차피 포인터를 파라미터로 넘기니 리턴값을 굳이 char *로 안해주고 void 로 해줘도 될거 같은데요.
#include
void strCpy(char *dest, const char *src) {
while ( *dest++ = *src++) ;
}
int main() {
char buf[100];
char *str="korea";
strCpy(buf, str);
printf("res : %s\n", buf);
return 0;
}
이렇게 구현해도 되는데 굳이 리턴형을 char * 로 한 이유가 있나요?
아님 그냥 관례상?
Forums:
여러모로 쓸모
여러모로 쓸모 있습니다.
dst 를 리턴해주면 바로
printf("res : %s\n", strcpy(buf, str));
가능합니다.
strcat 의 경우 joel 이 쓴 러시아 페인트 공 이야기 보시면 명확합니다
http://www.joelonsoftware.com/articles/fog0000000319.html
음...
좀 더 정확히 하면 void 가 아니라 void* 이 겠지요. 함수의 리턴형을 써 주는 이유는 그 함수가 어떠한 값을 돌려주는지 알기 위해서 써줍니다. 물론 함수가 포인터를 리턴할 경우 모두 void* 로 해도 상관은 없지만 그렇게 되면 함수의 리턴 값을 받을때 일일이 변환을 해줘야 하는 경우가 생기게 됩니다. 위 소스는 void* 라고 해도 상관은 없지만 시스템 함수들이 모두 void*로 되어 있다면 과연 어떤 값을 반환하는지 알 수 없겠죠. 한 예로 malloc 함수를 사용할 경우 변수 형에 맞게금 모두 캐스팅을 합니다.
질문하신분은 void*를
질문하신분은 void*를 잘못써서 void로 쓴게 아니라 아예 값을 반환할 필요가 없다는 뜻으로 void를 쓴거 같네요;
> string.h 에 있는 str~
> string.h 에 있는 str~ 류의 함수들 리턴형이 char * 인것이 많습니다.
> strcpy 같은 경우 char *strcpy(char *dest, const char *src); 인것처럼요.
>
> 어차피 포인터를 파라미터로 넘기니 리턴값을 굳이 char *로 안해주고 void 로 해줘도 될거 같은데요.
>
> #include
>
> void strCpy(char *dest, const char *src) {
> while ( *dest++ = *src++) ;
> }
>
참고로, 이식성을 고려해 strcpy() 함수를 C 언어로 구현할 경우 unsigned
char 형으로 접근해 문자열을 복사해야 합니다.
> int main() {
> char buf[100];
> char *str="korea";
>
> strCpy(buf, str);
> printf("res : %s\n", buf);
> return 0;
> }
>
> 이렇게 구현해도 되는데 굳이 리턴형을 char * 로 한 이유가 있나요?
> 아님 그냥 관례상?
>
무의미하게 버려질 수 있는 반환값 자리를 통해 유용한 의미를 제공하는
것으로 생각하시면 됩니다. str*() 함수가 void 형이 공식적으로 도입된
표준 C 언어 이전부터 존재했다는 점을 감안하면, 어차피 존재해야 하는
반환형을 통해 어떤 의미있는 결과를 넘겨주려 하는 것이 자연스러운
선택임을 이해할 수 있습니다.
추가로 str*() 함수의 반환값에 한가지 불만스러운 점은 쉽게 얻을 수 있는
문자열 처음 위치가 아닌 보다 많은 비용이 필요한 문자열 마지막 위치를
결과로 주지 않는다는 점입니다 - 그만큼 초기 설계에 많은 고민이 투자된
함수로 보기는 어렵습니다.
예를 들어 아래 코드를 보시기 바랍니다.
xstrcpy() 가 strcpy() 와 행동은 동일하지만 결과로 복사한 문자열의
마지막 위치를 반환해 준다고 한다면, 아래 함수가 보다 효율적으로 원하는
행동을 제공해준다는 것을 알 수 있습니다.
같은 맥락에서 적은 개수의 짧은 문자열을 연결할 때에는 strcat() 함수를
사용하는 것에 큰 비용이 들지 않지만, 여러 개의 문자열을 연결하고자
하는 경우에는 적절한 초기화와 함께 루프 안에서
와 같은 형태로 문자열을 복사해 나가는 것이 보다 효율적입니다.
물론, str*() 함수의 반환 결과는 오래전에 굳어진 것이라 표준화가
이루어질 무렵에는 이미 바꾸기에 늦어버린 상황이었습니다.
--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org (서버 공사중)
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
댓글 달기