que - ejemplos cdata xml
¿Qué significa-D_XOPEN_SOURCE/mean? (4)
Recientemente encontré un código que gcc no compilaría sin este argumento. Revisé la página man de gcc, pero no encontré esta opción específica. Encontré XOPEN_SOURCE
, pero había poca explicación de lo que hace.
¿Puede alguien por favor elaborar? Sé que -D_XOPEN_SOURCE
se puede configurar en diferentes valores, como 400
, 600
, pero ¿qué hacen?
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 dará una funcionalidad adicional que existe en los sistemas UNIX / BSD / Linux más recientes, pero probablemente no exista en otros sistemas como Windows.
Los números se refieren a diferentes versiones del estándar.
- 500 - X / Open 5, incorporando POSIX 1995
- 600 - X / Open 6, incorporando POSIX 2004
- 700 - X / Open 7, incorporando POSIX 2008
Puede decir cuál necesita (si corresponde) mirando la página de manual para cada función a la que llama.
Por ejemplo, man strdup
dice:
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 deberías 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 tu archivo fuente antes de hacer cualquier #include
si quieres usar strdup
.
O podrías poner
#define _GNU_SOURCE
en su lugar, lo que habilita toda la funcionalidad, con la desventaja de que podría no compilarse en Solaris, FreeBSD, Mac OS X, etc.
Es una buena idea consultar cada página de manual antes de hacer un #include
, #define
o usar una nueva función, porque a veces su comportamiento cambia dependiendo de qué opciones y #define
s tiene, por ejemplo con el basename(3) .
Ver también:
Esto expone el encabezado para que pertenezca a una definición de una norma determinada, como posix. La norma real a la que pertenece se define por el valor (aquí 400 o 600, por ejemplo). Consulte esta Reference para la vinculación norma / valor.
Por algún motivo desconocido, Mac OS / X (XCode) requiere 600 para definir strdup (), aunque está en la especificación de 1995. Mozilla y others han topado con esto ...
-D
es la opción del compilador de CA para definir una variable de preprocesador. En este caso _XOPEN_SOURCE
.
Esto en realidad no afecta el comportamiento del compilador en sí, sino que cambia la forma en que se comportan 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.
Definir uno de ellos a veces es necesario, porque el comportamiento de algunas funciones estándar o incluso su firma pueden diferir entre los estándares. Por lo tanto, es posible que -D_XOPEN_SOURCE
usar -D_XOPEN_SOURCE
o 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, mediante el cambio de extensiones que ofrece la implementación de su biblioteca C. Esta es una de las medidas que puede usar para asegurarse de que su código se ejecute en tantas plataformas como sea posible.