C библиотека против WinApi - PullRequest
11 голосов
/ 12 января 2009

Многие из стандартных функций библиотеки c (fwrite, memset, malloc) имеют прямые эквиваленты в Windows API (WriteFile, FillMemory / ZeroMemory, GlobalAlloc).

Помимо проблем переносимости, что следует использовать, функции CLIB или Windows API?

Будут ли функции C вызывать функции winapi или наоборот?

спасибо за помощь

Ответы [ 8 ]

16 голосов
/ 12 января 2009

В библиотеке Си нет ничего волшебного. Это просто стандартизированный API для доступа к общим службам из ОС. Это означает, что он реализован поверх ОС с использованием API, предоставляемого ОС.

Используйте то, что имеет смысл в вашей ситуации. Библиотека C является переносимой, Win32 - нет. С другой стороны, Win32 часто более гибок и предоставляет больше функциональных возможностей.

4 голосов
/ 12 января 2009

Это, вероятно, больше информации, чем вы ищете (и, возможно, не совсем то, что вы просили), но у Catch22.net есть статья под названием " Методы уменьшения размера исполняемого файла ", которая может помочь указать на различия в Win32 api звонки и звонки c runtime.

4 голосов
/ 12 января 2009

Функции на самом деле не эквивалентны, за исключением некоторых простых вещей, таких как ZeroMemory.

GlobalAlloc, например, дает вам память, но она также использовалась для передачи совместно используемой памяти под win16. Части этой функциональности все еще существуют.

WriteFile будет записывать не только в файлы, но и (среди прочих) именованные каналы. Что-то написать или написать не может напрямую.

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

В дальнейшем это упростит перенос на другие платформы.

2 голосов
/ 12 января 2009

Если вы собираетесь портировать свое приложение на несколько платформ, я бы сказал, что вы должны создать свой собственный набор оболочек, даже если вы используете стандартные функции Си. Это обеспечит вам максимальную гибкость при переключении платформ, поскольку ваш код будет лучше изолирован от базовой системы.

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

В конце концов вам просто нужно оставаться в соответствии с вашим выбором, и вы будете в порядке.

2 голосов
/ 12 января 2009

Будут ли функции C вызывать функции winapi или наоборот?

Функции C (которые реализованы в библиотеке пользовательского режима) вызывают функции WINAPI (которые реализованы в ядре O / S).

1 голос
/ 12 января 2009

Несколько дополнительных пунктов на некоторых примерах:

FillMemory, ZeroMemory

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

GlobalAlloc

Поскольку malloc () построен поверх примитивов операционной системы, предоставляемых его API, было бы интересно узнать, сосуществуют ли malloc () и прямое использование таких распределителей счастливо без проблем. Я мог бы представить себе некоторые причины, по которым malloc мог бы молча предположить, что куча, к которой он обращается, является непрерывной, даже если бы я назвал это ошибкой проектирования, даже если она была задокументирована, если дополнительные расходы на безопасность не были незначительными.

1 голос
/ 12 января 2009

Функции C будут вызывать системный API, Standard Runtime C Library (или CRT) - это API, используемый для стандартизации между системами.

Внутренне каждая система разрабатывает свой собственный API напрямую, используя системные вызовы или драйверы. Если у вас есть коммерческая версия Visual C ++, она использовалась для предоставления исходного кода CRT, это интересное чтение.

0 голосов
/ 11 ноября 2016

Что ж, в настоящее время я стараюсь избегать включения файлов fstream, sstream, iostream и многих стандартных библиотек C и использовать вместо них winAPI, поскольку включение любой из этих библиотек увеличивает размер выходного исполняемого файла с примерно 10 КБ до примерно 500 КБ. Но иногда лучше использовать стандартную библиотеку C, чтобы сделать ваш код кросс-платформенным. Поэтому я думаю, что это зависит от вашей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...