2012-03-27 2 views
6

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

  • _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 ».

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

Кроме того, существует ли индекс из libstdC++ - v3 в любом месте, то есть простой список всех функций в библиотеке я могу только найти manual и «source documentation», который, как представляется, не предлагает список функций.

+8

Некоторые из них не входят в стандартную библиотеку C++, поэтому в этих случаях ни один из них не является «стандартным». –

+2

Microsoft пытается быть последовательной, назвав свои нестандартные функции ведущим подчеркиванием. –

+1

'_atoi64' в MSVC называется' atoll' в GCC. – dan04

ответ

12

Это очень мало связано с 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.

+0

Значок подчеркивания означает «специфический для компилятора». Спасибо, еще одна вещь: вы только что изучили этот материал с течением времени или есть простой способ решить, является ли какая-либо данная функция POSIX, C99, новой в C++ 11 и т. Д.? Являются ли какие-либо функции как в стандартах POSIX, так и в C/C++ одновременно? – Qwertie

+0

И я думаю, что все методы POSIX, реализованные MSVC, имеют знак подчеркивания, тогда как все методы POSIX, реализованные GNU, не имеют подчеркивания. Мне нужно будет определить общее имя для моего кода, поэтому вы считаете, что лучше использовать подчеркивание в общем имени («#ifdef LINUX int _unlink (const char * p) {...}") или нет ("#ifdef WIN32 int unlink (const char * p) {...}")? – Qwertie

+0

О, и, к сожалению, я продолжаю думать о дополнительных вопросах - есть ли альтернативные имена, доступные в Windows и Linux? Например, вместо POSIX unlink() или C99 scalbn() существует ли стандартная функция C++ стандарта ISO для удаления файла или добавления чего-либо экспоненту в число с плавающей запятой? Или нет способа написать действительно портативный код на C++? – Qwertie

1

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

2

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

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

Смежные вопросы