2012-01-12 22 views

Respuesta

3

Mientras que las aplicaciones desarrolladas conforme a POSIX.1 - (IEEE 1.003,1-2.008, ISO/IEC 9945: 2009) y/o Single Unix Specification 2008 (ISO/IEC 9945: 2009 con X Maldiciones/abrir) ayudar a asegurar cuán portátil es tu aplicación El _GNU_SOURCE muy probablemente limitará el uso del código fuente a los sistemas GNU/Linux y GNU/Hurd, a menos que se realice un trabajo adicional para abordar la no portabilidad de dicha funcionalidad en otras plataformas.

Algunas empresas y contratos gubernamentales/militares pueden requerir ciertos estándares de plataforma para ser utilizados.

Si está desarrollando una aplicación de código abierto/software libre que desea que esté disponible en múltiples sistemas Unix y Unix (incluidos Microsoft Windows NT, 2000 y posteriores que tengan compatibilidad POSIX disponible), entonces limite su desarrollo a las funciones de la biblioteca POSIX.1 hace que esta sea una tarea más fácil. Otros objetivos incluyen las plataformas BSD libres/abiertas NetBSD, FreeBSD, OpenBSD, DragonflyBSD, así como los sistemas comerciales Unix (Solaris, AIX, HP/UX, etc.) que no incluyen la funcionalidad _GNU_SOURCE.

Si utiliza una funcionalidad alterada de una función portátil, no puedo pensar en un ejemplo, pero creo que existen, puede crear errores sutiles en plataformas que no sean de GNU.

En general, si su desarrollo ya está bloqueado en GNU/Linux y GNU/Hurd, puede usar tales extensiones, pero evite esos usos para cualquier aplicación que pueda implementarse en otros sistemas operativos tipo Unix y Unix .

Trabajo en una base de código grande que ha sido portada de otras dos plataformas Unix a Linux, y usamos extensiones _GNU_SOURCE con moderación, aunque la mayor parte del desarrollo está limitado a POSIX o IEEE 1003.1/Single Unix moderno Estándares Spec y C99 (Biblioteca estándar C) para compatibilidad futura.

+0

Gracias por la respuesta. Entre, probé el siguiente código: #include int main (int argc, char ** argv) { char * p; asprintf (& p, "% s", "Bienvenida"); printf ("Cadena es% s", p); } gcc -o mysample mysample.c: puedo compilar y ejecutar el código. No he incluido ninguna parte _GNU_SOURCE en el código fuente, no utilicé macro mientras compilaba. Pero igual cómo está compilando? – Whoami

+1

La documentación de GCC, en [C Dialect Options] (http://goo.gl/z0Piy) enumera que 'gnu89'/'gnu90' está predeterminado (en la versión 4.6.2 y muchas otras versiones también). 'gcc -v' para verificar su versión, y' cpp -dM mctylr

+0

En cuanto a la "funcionalidad alterada de una función portátil": me interesó encontrar un ejemplo de funciones con diferentes declaraciones en distintas Macros de Prueba de Característica, y encontré una: [mmap se declara de manera diferente dependiendo del nivel de cumplimiento POSIX, al menos en Solaris ] (http://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html?printOnly=1). – hmijail

5

_GNU_SOURCE habilita las extensiones de GNU a los estándares C y OS compatibles con la biblioteca GNU C, como asprintf. Defínalo cuando uses tales funciones y macros no estándares.

+0

¿Cuál es la desventaja de usar dicho estándar? No es portátil en la plataforma? – Whoami

+0

@Whoami: no portabilidad, de hecho. Las páginas de manual de la biblioteca C documentan a qué funcionalidad de estándares se adhiere. –

+0

Gracias por la respuesta.Entre, probé el siguiente código: #include int main (int argc, char ** argv) {char * p; asprintf (& p, "% s", "Bienvenida"); printf ("Cadena es% s", p); } gcc -o mysample mysample.c: puedo compilar y ejecutar el código. No he incluido ninguna parte _GNU_SOURCE en el código fuente, ni utilicé macro durante la compilación. Pero igual cómo está compilando? – Whoami

1

Algunas funciones no exigidas por el estándar se proporcionan en las bibliotecas, pero solo están disponibles cuando se define alguna macro de prueba de características. _GNU_SOURCE es una de las macros que hace que tales funciones estén disponibles.

Cuestiones relacionadas