페이지

2008년 10월 9일 목요일

fopen 옵션 정리

fopen의 파일 열기 옵션은 좀처럼 제대로 외우기가 쉽지 않다. 또한 모든 옵션별 차이점을 제대로 파악하기도 쉽지 않고... 일단 파악된 만큼 정리해 놓고... 추후 더 발견된 사항이 있으면 지속적으로 update해 나가는게 좋을 듯..

"r" : 읽기 전용 모드. 파일이 없으면 NULL return.
"w" :쓰기 전용 모드. 파일이 없으면 생성되고 있으면 내용이 없어진다.
"a" : append모드. 파일이 없으면 생성. 이미 존재하는 파일 끝부분에 file pointer가 위치하게 되며 이 위치부터 뒷쪽으로만 write가능. 읽기는 불가능. fseek등으로 이 부분보다 앞으로 file pointer를 이동시키면 어떻게 될까 ? 아래 내용으로 봐서는 fseek등으로 file pointer를 이동하여도 이와 상관없이 파일 끝부분에 write가 되는 것으로 생각됨.

Opening a file in append mode (a in the mode) causes all subsequent writes to the file to be forced to the current end-of-file, regardless of previous calls to the fseek() function.

"r+" : 읽고 쓰기 모드, 파일이 없으면 NULL return.
"w+" : 읽고 쓰기 모드 단, 파일이 없으면 만들고 있으면 기존 내용을 지움. write를 먼저 한 후 동일 파일 포인터로 읽기 수행이 필요한 경우 사용. 보통은 읽기 전용, 혹은 쓰기 전용으로 fopen하므로 w+가 필요한 일은 별로 없을 듯.
"a+" : append모드, 읽고 쓰기 가능. 파일이 이미 존재할 경우 그 파일의 끝부분에서부터 추가된 내용을 쓴다. 읽기는 fseek로 지정한 file pointer위치에서 가능하나 쓰기는 파일 끝부분에서만 가능.

When a file is opened with update mode (+ in the mode), both input and output may be performed on the associated stream

2008년 10월 6일 월요일

C에서 C++ 함수 호출하는 방법

많이 발생하는 경우는 아니지만, C에서 C++ 함수의 호출이 필요한 경우가 있다. 이런 경우에는 아래와 같은 방법으로 C++ 함수를 호출하여 사용할 수 있다.

먼저 호출하고자하는 함수를 extern "C"로 감싼다. 하지만 호출하고자 하는 함수가 클래스의 메소드일 경우에는 해당 메소드를 C 스타일의 전역 함수로 감싸야(wrapping) 한다.

//In the cpp file.
extern "C" void func_in_cpp(void);
...
extern "C"
{

 void func_in_cpp(void)
 {
  class_type class_obj_name;
  class_obj_name.class_method1();
 }
}

/* In the C file */
int main(void)
{
 ...
 func_in_cpp();
 ...
 return 0;
}

위에서와 같이 extern "C"로 선언/정의된 함수에서도 class의 instance를 만들고 사용할 수 있다. 즉 위에서와 같이 glue I/F를 만들어 주고 이를 C 프로그램에서 호출함으로써 C++ 코드안의 함수를 호출할 수 있다. 단 여기서 실행파일 생성 시 주의할 점이 있다.

glue I/F (cpp파일)나, C++ 라이브러리는 compile시 당연히 C++컴파일러로 컴파일한다. (ex. g++사용, gcc를 사용해도 확장자를 인식해 g++로 컴파일 될 것임.)

g++ -c cppfile.cpp

C++ 함수를 호출하는 C 프로그램은 당연히 C 컴파일러로 컴파일 한다. (ex. gcc 사용)

gcc -c cfile.c

마지막으로 link시 C++ library가 link되도록 옵션을 설정하여야 한다.
gcc의 경우, gcc대신 g++을 사용하여 link하면 간단하게 해결된다.

g++ -o c_application cfile.o cppfile.o

하지만 빌드 tool chain에 따라서 이를 별도의 linker옵션으로 설정해야 하는 경우도 있다.
아래는 QNX tool chain에서 제공하는 링커의 옵션을 사용한 경우의 예이다.

qcc -lang-c++ -o c_application cfile.o cppfile.o

여게서 -lang-c++은 linker옵션으로 linker에게 c++ library를 사용해야 한다고 알려준다.
gcc대신 g++을 사용해서 c++ 링커 옵션을 대신할 수 있듯이 QNX 툴도 qcc대신 QCC를 사용하면 c++ 옵션을 대신할 수 있다. 하지만 대소문자 구분이 되지 않는 Windows환경을 host 컴퓨터로 사용하고 있다면 QCC를 제대로 인식하지 못할 것이다. 이런 경우 -lang-c++을 사용해야 한다.

C에서 C++함수를 호출할 때는 몇가지 주의 사항이 있다. 이에 대한 자세한 내용은 "BINARY HACKS 해커가 전수하는 테크닉 100선, 타카바야시 사토루외 4인, O'REILLY ****" 에서 찾을 수 있다.