208 votes

Que signifie "#define _GNU_SOURCE" ?

Aujourd'hui, j'ai dû utiliser le basename() et la fonction man 3 basename ( ici ) m'a donné un message étrange :

Notes

Il existe deux versions différentes de nom de base() - le POSIX décrite ci-dessus, et la version Version GNU que l'on obtient après

#define _GNU_SOURCE
#include <string.h>

Je me demande ce que cette #define _GNU_SOURCE signifie : est-ce entachant le code que j'écris avec une licence de type GNU ? Ou est-elle simplement utilisée pour dire au compilateur quelque chose comme " Bon, je sais, cet ensemble de fonctions n'est pas POSIX, donc pas portable, mais j'aimerais quand même l'utiliser ".

Si c'est le cas, pourquoi ne pas donner aux gens des en-têtes différents, au lieu de devoir définir une obscure variable d'environnement pour obtenir une implémentation de fonction ou l'autre ?

Quelque chose me chiffonne également : comment le compilateur sait-il quelle implémentation de fonction lier avec l'exécutable ? Utilise-t-il cette #define également ?

Quelqu'un a des conseils à me donner ?

231voto

R.. Points 93718

Définition de _GNU_SOURCE n'a rien à voir avec la licence et tout à voir avec l'écriture de code (non) portable. Si vous définissez _GNU_SOURCE vous obtiendrez :

  1. accès à de nombreuses fonctions d'extension non standard de GNU/Linux
  2. l'accès aux fonctions traditionnelles qui ont été omises de la norme POSIX (souvent pour de bonnes raisons, comme le fait d'être remplacées par de meilleures alternatives, ou d'être liées à des implémentations héritées particulières)
  3. l'accès à des fonctions de bas niveau qui ne peuvent pas être portables, mais dont vous avez parfois besoin pour mettre en œuvre des utilitaires système tels que mount , ifconfig etc.
  4. comportement cassé pour de nombreuses fonctions spécifiées par POSIX, où les gens de GNU n'étaient pas d'accord avec le comité des standards sur la façon dont les fonctions devraient se comporter et ont décidé de faire leur propre truc.

Tant que vous êtes conscient de ces choses, cela ne devrait pas être un problème de définir _GNU_SOURCE mais vous devriez éviter de le définir et définir plutôt _POSIX_C_SOURCE=200809L ou _XOPEN_SOURCE=700 lorsque cela est possible, afin de garantir la portabilité de vos programmes.

En particulier, les choses de _GNU_SOURCE que vous devriez jamais l'utilisation sont #2 et #4 ci-dessus.

6voto

Chris Points 1249

Depuis une liste de diffusion via Google :

Regardez le include/features.h de la glibc :

_GNU_SOURCE Tout ce qui précède, plus les extensions GNU.

Ce qui veut dire que ça permet tout ça :

STRICT_ANSI , _ISOC99_SOURCE, _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED, _LARGEFILE_SOURCE, _LARGEFILE64_SOURCE, _FILE_OFFSET_BITS=N, _BSD_SOURCE, _SVID_SOURCE

Cela permet donc d'activer un grand nombre de drapeaux de compilation pour gcc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X