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 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 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 #include
s 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
, #define
o 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:
-D
es 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_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, 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.
fuente
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.
fuente
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 ...
fuente