standard spec c linux gcc gnu bsd

spec - ¿Qué hace-D_DEFAULT_SOURCE?



html spec (2)

Anteriormente recibía advertencias de gcc -std=c99 que implícitamente se declaraba usleep() . Luego me topé con esta publicación de stackoverflow , lo que me llevó a usar -D_BSD_SOURCE . Sin embargo, ahora gcc me dice que -D_BSD_SOURCE ha quedado en desuso y que debería usar -D_DEFAULT_SOURCE en -D_DEFAULT_SOURCE lugar.

#warning "_BSD_SOURCE and _SVID_SOURCE are deprecated, use _DEFAULT_SOURCE"

¿Por qué se desaprueba -D_BSD_SOURCE ? ¿Por qué se utiliza -D_DEFAULT_SOURCE lugar? ¿Y qué hace?

Hice algo de googlear , y los resultados están llenos de personas que lo usan para callarse. No pude descubrir por qué -D_BSD_SOURCE ha quedado en desuso, solo que lo es.


El manual de glibc describe cada macro de prueba de características (FTM) que incluye _DEFAULT_SOURCE :

Si define esta macro, la mayoría de las funciones se incluyen aparte de las extensiones X / Open, LFS y GNU: el efecto es habilitar las funciones de la edición 2008 de POSIX, así como ciertas funciones BSD y SVID sin una macro de prueba de funciones separada para controlar ellos. Definir esta macro, por sí solo y sin usar opciones de compilador como -ansi o -std=c99 , tiene el mismo efecto que no define ninguna de las macros de prueba de características; la definición junto con otras macros de prueba de características, o cuando se usan opciones como -ansi , habilita esas características incluso cuando las otras opciones de otro modo harían que se deshabiliten.

Este artículo de LWN.net sobre FTMs nos brinda una razón (entre otras informaciones quizás interesantes):

La intención original parece haber sido que, dentro de cada uno de los archivos de encabezado glibc que emplean FTM, solo una de las macros internas __USE_* debe regir la exposición de cualquier definición particular. Además, las macros no deben usarse en directivas #ifdef anidadas. Una inspección de los archivos del encabezado de glibc muestra rápidamente que la realidad está lejos de la intención, una situación que llevó a Roland McGrath a sugerir que era hora de que una limpieza importante devuelva las cosas a la situación deseada. Roland pensó que la tarea podría simplificarse eliminando los _SVID_SOURCE _BSD_SOURCE y _SVID_SOURCE , que, aunque históricamente tenían un propósito, han dejado de ser útiles en estos días. Además, dijo, las únicas macros que se necesitan para el código fuente moderno son aquellas que se relacionan con estándares formales más _GNU_SOURCE .

Joseph Myers debidamente obligado con una serie de parches para implementar los primeros pasos en este trabajo. El enfoque conservador alentado por Roland significó que la _SVID_SOURCE FTM _SVID_SOURCE y _SVID_SOURCE se está llevando a cabo en dos versiones de glibc. La versión 2.19 de glibc agregó un nuevo FTM, _DEFAULT_SOURCE . La definición de esta macro hace que las definiciones predeterminadas queden expuestas incluso cuando la definición explícita de otras macros haría que eso no sucediera. El efecto de definir esta macro es equivalente al efecto de definir explícitamente tres macros en versiones anteriores de glibc:

cc -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809C

Entonces, si necesita definir _SVID_SOURCE o _SVID_SOURCE , simplemente defina _DEFAULT_SOURCE también. Las versiones de glibc <= 2.18 no se preocupan y las versiones> = 2.19 no avisan si se han definido las tres o las tres.


Necesito portabilidad más allá de Linux y más allá de glibc, y no me gusta # ifdef. asi que:

/* asprintf() does not appear on linux without this */ #define _GNU_SOURCE /* gettimeofday() does not appear on linux without this. */ #define _BSD_SOURCE /* modern glibc will complain about the above if it doesn''t see this. */ #define _DEFAULT_SOURCE