Двоичная совместимость FILE * - PullRequest
3 голосов
/ 11 апреля 2011

Я проектирую библиотеку C, которая выполняет некоторые математические вычисления. Мне нужно указать интерфейс сериализации, чтобы иметь возможность сохранять, а затем загружать некоторые данные. Вопрос в том, правильно ли (с точки зрения бинарной совместимости) использовать указатель FILE * в публичном API библиотеки?

Целевые платформы:

  • Linux x86, x86_64 с gcc> = 3.4.6
  • Windows x86, x86_64> = WinXP с VS> = 2008sp1

Мне нужно быть настолько совместимым с двоичными файлами, насколько это возможно, поэтому на данный момент мой вариант выглядит следующим образом:

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

Так что мне любопытно, правильно ли использовать FILE * или лучше переключиться на wchar * / char *?

Ответы [ 4 ]

4 голосов
/ 11 апреля 2011

Я не согласен с ThiefMaster: нет смысла переходить на нативный (т. Е. Использовать дескрипторы файлов типа int в linux и дескрипторы типа void * в windows), когда есть эквивалентное переносимое решение.

Я бы, вероятно, пошел с FILE * вместо того, чтобы открывать файлы по имени из библиотеки: это может быть больше хлопот для пользователей библиотеки, но это также более гибко, так как большинство реализаций libc предоставляют различные способы открытия файлов (fopen(), _wfopen(), _fdopen(), fdopen(), fmemopen(), ...) и вам не нужно самостоятельно поддерживать отдельные API-интерфейсы с широкими символами.

2 голосов
/ 11 апреля 2011

Я бы не использовал ни того, ни другого, но позволил бы пользователю передавать дескриптор файла как int.

Тогда вы можете fdopen() использовать его в своем коде, чтобы получить FILE*.

* 1007.* Однако при использовании Windows это может быть не лучшим решением, даже если в нем есть некоторые вспомогательные функции для получения числового дескриптора файла.

Однако, передача FILE* или const char* должнатоже будет хорошоЯ бы предпочел передать имя файла, так как это меньше кода для записи, если библиотека позаботится об открытии / закрытии файла.

1 голос
/ 11 апреля 2011

Да, правильно, с точки зрения стабильного двоичного интерфейса, использовать FILE * здесь. Я думаю, возможно, вы путаете это с использованием FILE в отличие от указателя на него. Обратите внимание, что функции fopen, fgets и т. Д. Вашей стандартной библиотеки используют (как аргументы и возвращаемые значения) тип FILE * как часть своих открытых интерфейсов.

0 голосов
/ 03 сентября 2011

A FILE * - это стандартный тип ANSI / ISO C89 и C99 (даже K & R).Это мечта о мобильности, и я бы предпочел ее всем остальным.Вы можете пойти с этим.Это не станет лучше, чем это.

...