Hoy tuve que usar la basename()
función, y el man 3 basename
( aquí ) me dio un mensaje extraño:
Notas
Hay dos versiones diferentes de basename () : la versión POSIX descrita anteriormente y la versión GNU , que se obtiene después
#define _GNU_SOURCE
#include <string.h>
Me pregunto qué #define _GNU_SOURCE
significa esto : ¿está contaminando el código que escribo con una licencia relacionada con GNU? ¿O simplemente se usa para decirle al compilador algo como " Bueno, lo sé, este conjunto de funciones no es POSIX, por lo tanto no es portátil, pero me gustaría usarlo de todos modos ".
Si es así, ¿por qué no dar a las personas diferentes encabezados, en lugar de tener que definir alguna macro oscura para obtener una implementación de una función u otra?
Algo también me molesta: ¿cómo sabe el compilador qué implementación de función vincular con el ejecutable? ¿Utiliza esto #define
también?
¿Alguien tiene algunos consejos para darme?
_GNU_SOURCE
es para obtenerstrfry
ymemfrob
.#define _GNU_SOURCE
se recomienda que sea "lo primero en el archivo, precedido solo por comentarios")._FILE_OFFSET_BITS
, no_GNU_SOURCE
.Permítanme responder dos puntos más:
Un enfoque común es
#define
identificar condicionalmentebasename
a diferentes nombres, dependiendo de si_GNU_SOURCE
está definido. Por ejemplo:Ahora la biblioteca simplemente necesita proporcionar ambos comportamientos bajo esos nombres.
A menudo, el mismo encabezado tenía contenidos ligeramente diferentes en diferentes versiones de Unix, por lo que no hay un contenido correcto único para, digamos,
<string.h>
hay muchos estándares ( xkcd ). Hay un conjunto completo de macros para elegir su favorito, de modo que si su programa espera un estándar, la biblioteca se ajustará a eso.fuente
Para obtener detalles exactos sobre lo que todos están habilitados
_GNU_SOURCE
, la documentación puede ayudar.De la documentación de GNU:
Desde la página de manual de Linux en macros de prueba de características :
Nota :
_GNU_SOURCE
debe definirse antes de incluir archivos de encabezado para que los encabezados respectivos habiliten las funciones. Por ejemplo:_GNU_SOURCE
también se puede habilitar por compilación usando-D
flag:(
-D
no es específico_GNU_SOURCE
pero cualquier macro se define de esta manera).fuente
De alguna lista de correo a través de google:
Por lo tanto, permite una gran cantidad de indicadores de compilación para gcc
fuente