fopen64() 사용시..
글쓴이: zZze / 작성시간: 수, 2003/02/05 - 2:42오전
리눅스에서.. 점 큰 화일을 사용할려구 점 뒤적거려 보니까..
fopen64()라는 넘이 있네요.. 사용해 보니 잘 되긴 하는데..
컴파일 해 보니 warning이 뜹니다..
Quote:
warning: implicit declaration of function `fopen64'
이렇게요.. :cry:
그냥 stdio.h 만 include 해 주면 되는게 아닌가요??
stdio.h에는...
Quote:
#ifdef __USE_LARGEFILE64
extern FILE *fopen64 (__const char *__restrict __filename,
__const char *__restrict __modes) __THROW;
extern FILE *freopen64 (__const char *__restrict __filename,
__const char *__restrict __modes,
FILE *__restrict __stream) __THROW;
#endif
이렇게 정의되여 있는데..
그럼 #define __USE_LARGEFILE64를 소스 앞에 추가해야 하는건지..
머 그래두 여전히 warning는 나오구.. :oops:
얼케하면 깨끗하게 컴파일 할 수 있을까요..?? :wink:
Forums:
제가 사용하는 wowlinux 7.0에서는 아래와 같이 컴파일 하니깐
제가 사용하는 wowlinux 7.0에서는 아래와 같이 컴파일 하니깐
warning message가 없더군여..
참고로 (FILE *)로 casting을 해주지 않으니깐 warning message가
발생이 되던데.. 고참 이상하군여. fopen64()의 return type이 FILE*
아닌가여? ^^;
이렇게 한번해보세여.. 그럼...
컴파일시 -D__USE_LARGEFILE64 옵션을 넣어주면 될듯합니다.
컴파일시 -D__USE_LARGEFILE64 옵션을 넣어주면 될듯합니다.
소스상에서 하려면 #include <stdio.h>를 선언하기 이전에
#define __USE_LARGEFILE64 를 하면 되구요....
제가 테스트를 해보지 않아서 정확하지는 않네요....
세상은 하나..........
/usr/include/features.h 참고..
대부분의 표준 헤더 파일에 보면은
/usr/include/features.h 를 인클루드 하는것을 볼수 있으며,
이 파일에서 __USE_* 같은 매크로들을 디파인 합니다.
물론, features.h 초반부에 모든 __USE_* 들을 언디파인 하므로,
__USE_* 를 디파인 하고나서 해당 헤더파일을 인클루드하는것은
의미가 없습니다.
그럼 어떤것을 디파인해야 하는가...;;;
/usr/include/features.h 맨 처음부분에 보면은 설명이 있습니다.
__STRICT_ANSI__ ISO Standard C.
_ISOC99_SOURCE Extensions to ISO C89 from ISO C99.
_POSIX_SOURCE IEEE Std 1003.1.
_POSIX_C_SOURCE If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2;
if >=199309L, add IEEE Std 1003.1b-1993;
if >=199506L, add IEEE Std 1003.1c-1995
_XOPEN_SOURCE Includes POSIX and XPG things. Set to 500 if
Single Unix conformance is wanted, to 600 for the
upcoming sixth revision.
_XOPEN_SOURCE_EXTENDED XPG things and X/Open Unix extensions.
_LARGEFILE_SOURCE Some more functions for correct standard I/O.
_LARGEFILE64_SOURCE Additional functionality from LFS for large files.
_FILE_OFFSET_BITS=N Select default filesystem interface.
_BSD_SOURCE ISO C, POSIX, and 4.3BSD things.
_SVID_SOURCE ISO C, POSIX, and SVID things.
_GNU_SOURCE All of the above, plus GNU extensions.
_REENTRANT Select additionally reentrant object.
_THREAD_SAFE Same as _REENTRANT, often used by other systems.
그러므로.;; (결론 내는데 정말 오래 걸렸군요 -_-;;)
컴파일 시에 -D_LARGEFILE64_SOURCE 옵션을 붙이거나,
모든 헤더 인클루드 하기 전에
#define _LARGEFILE64_SOURCE
를 하면 됩니다.
저같은 경우에는 길게 쓰기 귀찮아서 -_-;;
-D_GNU_SOURCE 하는 경우가 많습니다 ^^;
헐..
헐.. 그렇쿤요.. /usr/include/features.h를 읽어 보지 못했네요..
이눔의 게으름이란.. :oops:
참고로.. (FILE *) 캐스팅은 제 경우처럼 헤더를 제대로 인클루드 못했기 때문인것 같네요.. -Wall 옵션을 주셔서 컴파일 해 보시면 저랑 같은 warning을 보실겁니다.. -_-+
답변 감사 드립니다.. :)
댓글 달기