¿Qué significa -D_XOPEN_SOURCE?

103

Recientemente encontré un código que gcc no compilaría sin este argumento. Revisé la página de manual de gcc, pero no encontré esta opción específica. Lo encontré XOPEN_SOURCE, pero hubo poca explicación de lo que hace.

¿Alguien puede dar más detalles? Sé que -D_XOPEN_SOURCEse puede ajustar a diferentes valores, por ejemplo 400, 600pero lo que hacemos las tareas pendientes?

anio
fuente

Respuestas:

132

Cuando tu lo hagas

#define _XOPEN_SOURCE <some number>

o

cc -D_XOPEN_SOURCE=<some number>

le dice a su compilador que incluya definiciones para algunas funciones adicionales que están definidas en los estándares X / Open y POSIX.

Esto le brindará algunas funciones adicionales que existen en los sistemas UNIX / BSD / Linux más recientes, pero que probablemente no exista en otros sistemas como Windows.

Los números se refieren a diferentes versiones del estándar.

Puede saber cuál necesita (si corresponde) mirando la página de manual de cada función que llame.

Por ejemplo, man strdupdice:

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       strdup(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
       strndup(), strdupa(), strndupa(): _GNU_SOURCE

Lo que significa que debes poner uno de estos:

#define _SVID_SOURCE
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700

en la parte superior de su archivo fuente antes de hacer cualquier #includes si desea usar strdup.

O podrías poner

#define _GNU_SOURCE

en su lugar, lo que habilita todas las funciones, con el inconveniente de que es posible que no se compile en Solaris, FreeBSD, Mac OS X, etc.

Es una buena idea revisar cada página de manual antes de hacer una #include, #defineo usar una nueva función, porque a veces su comportamiento cambia dependiendo de las opciones y correos electrónicos#define que tenga, por ejemplo, con basename (3) .

Ver también:

Mikel
fuente
4
Solo un comentario para subrayar lo importante que es "en la parte superior de su archivo fuente" para estas definiciones de dialecto de idioma. Si no están en la cima, no funcionan.
Dr. Person Person II
6

-Des una opción del compilador de CA para definir una variable de preprocesador. En este caso _XOPEN_SOURCE.

En realidad, esto no afecta el comportamiento del compilador en sí, sino que cambia el comportamiento de algunas bibliotecas, por ejemplo, la biblioteca c estándar. Hay varias opciones como esta. En la mayoría de los casos, están relacionados con algún documento estándar sobre alguna interfaz de programación específica de UNIX, o algún proveedor de biblioteca específico.

En ocasiones, es necesario definir uno de ellos, porque el comportamiento de algunas funciones estándar o incluso su firma pueden diferir entre estándares. Por lo tanto, es posible que deba usar -D_XOPEN_SOURCEo algo similar para activar un modo de compatibilidad.

Otro posible uso de estos indicadores es asegurarse de que su código fuente se mantenga dentro de los límites de un cierto estándar, cambiando las extensiones ofrecidas por la implementación de su biblioteca C. Esta es una de las medidas que puede utilizar para asegurarse de que su código se ejecute en tantas plataformas como sea posible.

Davrieb
fuente
3

Esto expone que el encabezado pertenece a una definición de una norma dada, como posix. La norma real a la que pertenece está definida por el valor (aquí 400 o 600 por ejemplo). Consulte esta Referencia para conocer la vinculación de normas / valores.

Aif
fuente
1

Por alguna razón desconocida, Mac OS / X (XCode) requiere 600 para definir strdup (), aunque está en la especificación de 1995. Mozilla y otros se han encontrado con esto ...

jesup
fuente