Почему имена стандартных библиотечных функций различаются в Windows и Linux? - PullRequest
6 голосов
/ 27 марта 2012

Я портирую библиотеку Windows на Android (с опцией GNU Standard C ++ Library, libstdc ++ - v3), и, похоже, между библиотеками VC и GNU существуют многочисленные различия в именах, например ::

  • _stricmp называется strcasecmp вместо
  • _unlink называется unlink
  • _scalb называется scalbn
  • _finite называется isfinite
  • _isnan называется isnan
  • _itoa и itoa в GNU C ++
  • atoi существует, но не atoi64

Документация библиотек VC и GNU подразумевает, что они реализуют "ISO" C ++, например, я могу получить несколько предупреждений из VC2008 за неиспользование имен "ISO C ++", таких как это: "warning C4996: ' itoa ': имя POSIX для этого элемента устарело. Вместо этого используйте совместимое имя ISO C ++: _itoa. " Точно так же в руководстве GNU говорится, что «Стандартная библиотека C ++ GNU v3 - это продолжающийся проект по реализации стандартной библиотеки C ++ ISO 14882».

Так, как библиотеки заканчивают с этими различными именами? Как я могу сказать, какие имена являются более "стандартными"?

Кроме того, есть ли где-нибудь index libstdc ++ - v3, то есть простой список всех функций в библиотеке? Я могу найти только руководство и " исходную документацию ", которая, как представляется, не предлагает список функций.

Ответы [ 3 ]

12 голосов
/ 27 марта 2012

Это имеет очень мало общего со стандартной библиотекой C ++. Это больше связано с C99 и POSIX.

  • strcasecmp - это функция POSIX, которую реализует libstdc ++. msvcrt обычно находится на расстоянии вытянутой руки от POSIX.
  • unlink аналогично - это функция POSIX.
  • scalbn - это название функции в стандарте C99. MSVC не поддерживает C99. Однако scalbn является частью C ++ 11, поэтому я ожидаю, что в конечном итоге он появится в msvcrt.
  • isfinite и isnan - оба C99.
  • itoa не является ни C99, ни POSIX. Это странный зверь, который просто появляется ночью.

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

2 голосов
/ 27 марта 2012

Ни один из них не является стандартным.Стандарт гласит, что вы не должны добавлять имена, хотя именно это и означают предупреждения.Подчеркивание делает их совместимыми со стандартами, потому что они не будут путаться как что-то в стандарте C / C ++.

Они подразумевают, что, добавив подчеркивание, ваш код будет использовать что-то в стандарте, но ни одна из версий этого не делает.

1 голос
/ 27 марта 2012

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

...