2011-04-11 2 views
3

일부 수학적 계산을 수행하는 C 라이브러리를 설계하고 있습니다. 직렬화 인터페이스를 지정하여 일부 데이터를 저장하고로드 할 수 있어야합니다. 질문은 라이브러리의 공용 API에서 FILE * 포인터를 사용하는 것이 올바른지 (바이너리 호환성 관점에서)?FILE의 이진 호환성 *

대상 platfoms은 다음과 같습니다

  • 리눅스는 x86, GCC와 x86_64에> = 3.4.6
  • 윈도우는 x86, x86_64에> = WINXP VS와> = 2008sp1 내가해야

가능한 한 많은 바이너리 호환이 가능하므로 현재 내 변형은 다음과 같습니다.

void SMModuleSave(SMModule* module, FILE* dest); 
SMModule* SMModuleLoad(FILE* src); 

그래서 나는 호기심이 많습니다. FILE *을 사용하거나 wchar */char *로 전환하는 것이 맞습니까?

+0

필자는 파이썬과 MATLAB 스크립트 내부에서이 라이브러리를 사용할 수 있어야하므로 파일 설명자를 사용하기로 결정했습니다. 두 언어 모두 fd를 제공하지만 FILE은 제공하지 않습니다 *. 그래서 저는 fileno가 표준에 있지 않다는 사실에도 불구하고 그것을 사용하기로 결정했습니다. – prokher

+0

또 다른 문제가 발생했습니다 : AFAIK 정적 C 런타임 (/ MT,/MTd 사용)으로 빌드 된 DLL의 API 인 경우 파일 설명자와 FILE * 둘 다 사용하는 것은 올바르지 않습니다 - [msdn-link] (http : /msdn.microsoft.com/en-us/library/ms235460%28v=vs.80%29.aspx). 나는 혼란 스럽다. API에서 파일 이름을 사용하고 싶지는 않습니다. 왜냐하면 파일 온 디스크에서만 사용을 제한하기 때문입니다. 반대로, fd 나 FILE *를 사용하면 스트림을 지정하는 가용성이 있지만 정적 CRT의 경우는 그렇지 않습니다. 나는 붙어있다. : – prokher

답변

4

: 동등한 휴대용 솔루션이있을 때 (즉, 리눅스 및 윈도우에 입력 void *의 핸들에 유형 int의 파일 디스크립터를 사용) 기본가는에는 효과가 없습니다.

라이브러리에서 이름으로 파일을 여는 대신 FILE *을 사용해야 할 것 같습니다. 라이브러리 사용자에게는 더 많은 번거 로움이 있지만 대부분의 libc 구현은 파일 열기를 위해 다양한 방법을 제공하므로 더 융통성이 있습니다 (fopen(), _wfopen(), _fdopen(), fdopen(), fmemopen(), ...), 별도의 와이드 문자 API를 직접 관리 할 필요가 없습니다.

+0

네, 그건 별도의 와이드 char 버전을 유지하는 것을 피하기위한 아이디어였습니다. 고맙습니다. – prokher

2

나는 둘 다 사용하지 않고 사용자가 파일 설명자를 int으로 전달하도록합니다.

코드에서 fdopen()을 입력하면 FILE*이됩니다.

그러나 Windows를 사용할 때 숫자 파일 설명자를 얻기위한 몇 가지 도우미 기능이 있어도 최상의 솔루션이 아닐 수도 있습니다.


그러나, FILE* 또는 const char*도 괜찮을 전달합니다. 라이브러리가 파일을 열거 나 닫을 때 쓰는 코드가 적기 때문에 파일 이름을 전달하는 것을 선호합니다. 내가 ThiefMaster에 동의하지 않는

+0

파일 디스크립터와'FILE *'은 대부분이 fuse()와'fileno() '를 통해 다른 것을 얻을 수 있기 때문에 대부분이 호환이 가능하다. 그러나 그것들 중 하나만이 C의 일부이다. 표준 라이브러리가 아닌데 왜 덜 이식성있는 솔루션을 선택하게 될까요? – Christoph

+0

'FILE * '을 통해 파일 기술자를 선택해야하는 몇 가지 이유가 있습니다 : IO 오류로부터 복구 할 수 있어야 할 때, nonblocking IO를 수행하거나 프로그램이 차단되는 시점을 제어하거나 다른 프로세스/프로그램이 열린 파일을 상속 할 때 버퍼에서 입력이 손실되지 않도록해야 할 때 이러한 항목 중 아무 것도 여기에 적용되지 않는 것 같습니다. 'FILE *'을 사용하십시오. –

+0

실제로 파이썬과 MATLAB 스크립트 내부에서이 라이브러리를 사용할 수 있어야하기 때문에 결국 파일 기술자를 사용하기로 결정했습니다. 두 언어 모두 fd는 제공하지만 FILE은 제공하지 않습니다. f에도 불구하고 그것을 사용하기로 결정했다. fileno가 c 표준에 있지 않다는 것을 행동하십시오. – prokher

1

예 안정적인 이진 인터페이스 관점에서 여기에 FILE *을 사용하는 것이 맞습니다. 아마도 이것에 대한 포인터와 반대로 FILE을 사용하는 것을 혼란스럽게 생각한다고 생각합니다. 표준 라이브러리의 fopen, fgets 등의 함수는 모두 공용 인터페이스의 일부로 FILE * 유형을 인수 (arguments)와 반환 값 (return values) 모두로 사용합니다.

0

FILE *은 표준 ANSI/ISO C89 및 C99 (심지어 K & R) 유형입니다. 그것은 이식성의 꿈이고 나는 다른 무엇보다도 그것을 좋아할 것입니다. 너는 그걸로가는 것이 안전하다. 그것보다 더 좋아질 것은 없습니다.