Aujourd'hui, j'ai dû utiliser la basename()
fonction, et man 3 basename
( ici ) m'a donné un message étrange:
Remarques
Il existe deux versions différentes de basename () - la version POSIX décrite ci-dessus et la version GNU , que l'on obtient après
#define _GNU_SOURCE
#include <string.h>
Je me demande ce que cela #define _GNU_SOURCE
signifie: est-ce que cela entache le code que j'écris avec une licence liée à GNU? Ou est-ce simplement utilisé pour dire au compilateur quelque chose comme " Eh bien, je sais, cet ensemble de fonctions n'est pas POSIX, donc pas portable, mais j'aimerais quand même l'utiliser ".
Si tel est le cas, pourquoi ne pas donner aux gens des en-têtes différents, au lieu d'avoir à définir une macro obscure pour obtenir une implémentation de fonction ou une autre?
Quelque chose me dérange aussi: comment le compilateur sait-il quelle implémentation de fonction lier avec l'exécutable? L'utilise-t-il #define
également?
Quelqu'un a des conseils à me donner?
_GNU_SOURCE
est d'obtenirstrfry
etmemfrob
.#define _GNU_SOURCE
est recommandé d'être "la toute première chose dans le fichier, précédée uniquement de commentaires")._FILE_OFFSET_BITS
, non_GNU_SOURCE
.Permettez-moi de répondre à deux autres points:
Une approche courante consiste à
#define
identifier conditionnellementbasename
des noms différents, selon qu'ils_GNU_SOURCE
sont définis ou non. Par exemple:Désormais, la bibliothèque doit simplement fournir les deux comportements sous ces noms.
Souvent, le même en-tête avait un contenu légèrement différent dans différentes versions d'Unix, il n'y a donc pas de contenu unique pour, disons,
<string.h>
- il existe de nombreuses normes ( xkcd ). Il y a tout un ensemble de macros pour choisir votre préférée, de sorte que si votre programme attend un standard, la bibliothèque se conformera à cela.la source
Pour plus de détails sur ce qui est activé par
_GNU_SOURCE
, la documentation peut vous aider.À partir de la documentation GNU:
Depuis la page de manuel Linux sur les macros de test de fonctionnalités :
Remarque :
_GNU_SOURCE
doit être défini avant d' inclure les fichiers d'en-tête afin que les en-têtes respectifs activent les fonctionnalités. Par exemple:_GNU_SOURCE
peut également être activé par compilation en utilisant l'-D
indicateur:(
-D
n'est pas spécifique à_GNU_SOURCE
mais toute macro doit être définie de cette façon).la source
À partir d'une liste de diffusion via google:
Donc, il permet un grand nombre d'indicateurs de compilation pour gcc
la source