2012-03-27 28 views
6

Estoy portar una biblioteca de Windows para Android (con la GNU C++ estándar opción de biblioteca, libstdC++ - v3) y parece que hay numerosas diferencias de nombre entre las bibliotecas VC y GNU, por ejemplo:¿Por qué los nombres de funciones de biblioteca estándar son diferentes entre Windows y Linux?

  • _stricmp se llama strcasecmp en lugar
  • _unlink se llama unlink
  • _scalb se llama scalbn
  • _finite se llama isfinite
  • _isnan se llama isnan
  • _itoa y itoa no parecen existir en GNU C++
  • atoi sí existe, pero no atoi64

La documentación de ambas bibliotecas VC y GNU implica que implementan "ISO "C++, por ejemplo, puedo obtener algunas advertencias del VC2008 por no usar nombres" ISO C++ ", como este:" advertencia C4996: 'itoa': el nombre POSIX para este elemento está en desuso. En su lugar, utilice el nombre conforme a ISO C++: _itoa. "De manera similar, el manual de GNU dice:" La biblioteca GNU Standard C++ v3 es un proyecto en curso para implementar la biblioteca estándar ISO 14882 C++ ".

Entonces, ¿cómo terminan las bibliotecas con estos ?? diferentes nombres ¿Cómo puedo saber qué nombres son más "estándar"

Además, ¿hay una índice de de libstdC++ - v3 en cualquier lugar, es decir, una simple lista de todas las funciones de la biblioteca sólo puedo encontrar un manual y el "source documentation" que no parece ofrecer una lista de funciones.

+8

Varios de estos no están en la biblioteca estándar de C++, por lo que en esos casos, ninguno es "estándar". –

+2

Microsoft intenta ser coherente al nombrar sus funciones no estándar con un subrayado inicial. –

+1

'_atoi64' en MSVC se llama' atoll' en GCC. – dan04

Respuesta

12

Esto tiene muy poco que ver con el C++ biblioteca estándar. Tiene más que ver con C99 y POSIX.

  • strcasecmp es una función POSIX que implementa libstdC++. msvcrt normalmente se mantiene alejado de POSIX.
  • unlink es similar, es una función POSIX.
  • scalbn es el nombre de la función en el estándar C99. MSVC no es compatible con C99. Sin embargo, scalbn es parte de C++ 11, por lo que esperaría que se muestre en msvcrt eventualmente.
  • isfinite y isnan son ambos C99.
  • itoa no es ni C99 ni POSIX. Es una bestia extraña que simplemente aparece en la noche.

También señalaré lo que varios otros han señalado: es técnicamente más correcto prefijar cualquier función en la biblioteca estándar que en realidad no sea estándar con un guión bajo. Esa es la razón de la proliferación de caracteres de subrayado en msvcrt.

+0

Por lo tanto, un guión bajo indica "específico del compilador". Gracias, solo una cosa más: ¿acabas de aprender esto con el tiempo, o hay una manera fácil de determinar si alguna función es POSIX, C99, nueva en C++ 11, etc.? ¿Hay funciones en los estándares POSIX y C/C++ al mismo tiempo? – Qwertie

+0

Y creo que todos los métodos POSIX implementados por MSVC tienen un guión bajo, mientras que todos los métodos POSIX implementados por GNU no tienen un guión bajo. Necesitaré definir un nombre común para mi código, así que, ¿crees que sería mejor usar un guión bajo en el nombre común ("#ifdef LINUX int _unlink (const char * p) {...}") o no ("#ifdef WIN32 int unlink (const char * p) {...}")? – Qwertie

+0

Ah, y - lo siento, sigo pensando en más preguntas - ¿hay nombres alternativos que estén disponibles tanto en Windows como en Linux? Por ejemplo, en lugar de POSIX unlink() o C99 scalbn(), ¿existe una función C++ estándar de ISO para eliminar un archivo o agregar algo al exponente en un número de coma flotante? ¿O no hay forma de escribir código C++ verdaderamente portátil? – Qwertie

1

supongo que cualquier aplicación puede llamar a su puesta en práctica "la norma ISO" si anteponer _ a los nombres de las funciones y hacer lo que quieran, ya que esos identificadores son garantizado que ser reservado a la aplicación de la norma. Pero tampoco se garantiza que sean portátiles.

2

Ninguno de ellos son estándar. El estándar sí dice que no debe agregar nombres, aunque eso es lo que significan las advertencias. El guión bajo los hace compatibles con los estándares porque no se confundirán como algo en C/C++ estándar.

Implican que al agregar el guión bajo indica que su código usará algo en el estándar, pero ninguna de las dos versiones.

Cuestiones relacionadas