Que fait la SOURCE par défaut-d?

auparavant, je recevais des avertissements de gcc -std=c99usleep() a été implicitement déclaré. Puis je suis tombé sur c'stackoverflow post, qui m'a conduit à utiliser -D_BSD_SOURCE. Cependant, maintenant gcc me dit que -D_BSD_SOURCE a été déprécié, et je dois utiliser -D_DEFAULT_SOURCE à la place.

#warning "_BSD_SOURCE and _SVID_SOURCE are deprecated, use _DEFAULT_SOURCE"

Pourquoi -D_BSD_SOURCE obsolète? Pourquoi est -D_DEFAULT_SOURCE utilisé à la place? Et que fait-il?

j'ai fait une recherche sur google, et les résultats sont remplis avec les gens de l'utiliser pour fermer gcc. Je ne pouvais pas trouver pourquoi-D_BSD_SOURCE a été dépréciée, juste qu'elle l'est.

15
demandé sur Community 2015-03-23 03:17:08

2 réponses

glibc manuel décrit chaque macro de test de fonctionnalité (FTM) incluant _DEFAULT_SOURCE:

Si vous définissez cette macro, la plupart des fonctionnalités sont incluses en dehors de X / Open, LFS et GNU extensions: l'effet est d'activer les fonctionnalités à partir de L'édition 2008 de POSIX, ainsi que certaines fonctionnalités de BSD et SVID sans macro de test pour les contrôler. La définition de ce macro, en elle-même et sans utiliser les options du compilateur telles que -ansi ou -std=c99, a le même effet que de ne pas définir de macros de test de fonctionnalité; la définir avec d'autres macros de test de fonctionnalité, ou quand les options -ansi est utilisé, permet ces fonctionnalités même si l'autre autrement, les options entraîneraient leur désactivation.

ce LWN.net article à propos de FTMs nous fournit une justification (parmi d'autres peut-être une info intéressante):

L'intention originale semble avoir été que, dans chaque de la glibc les fichiers d'en-tête qui utilisent des FTMs, seulement un des __USE_* interne les macros doivent régir l'exposition de définition particulière. De plus, les macros ne doivent pas être utilisées dans les #ifdef directive. Une inspection des fichiers d'en-tête glibc montre rapidement que la réalité est loin de l'intention, une situation qui a conduit Roland McGrath suggérer qu'il était temps pour un grand nettoyage à apporter retour à la situation prévue. Roland pensait cette tâche pourrait être simplifié en éliminant le _BSD_SOURCE et _SVID_SOURCE FTMs, qui, bien qu'ils aient eu un but historique, ont cessé d'être utile ces jours-ci. Il a dit, les seules macros qui sont nécessaires pour le code source moderne sont ceux qui se rapportent à des normes formelles plus _GNU_SOURCE.

Joseph Myers dûment tenu avec une série de correctifs pour mettre en œuvre les premiers pas dans ce travail. L'approche conservatrice encouragée par Roland signifiait que la désapprobation de l' _BSD_SOURCE et _SVID_SOURCE FTMs se déroule sur deux versions de glibc. Version 2.19 de glibc ajouté un nouveau FTM,_DEFAULT_SOURCE. La définition de cette macro fait que les définitions par défaut sont exposées même lorsque les la définition d'autres macros ferait en sorte que cela n'arrive pas. Effet de définir cette macro est équivalent à l'effet de la définition des trois macros dans les précédentes versions de la glibc:

cc -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809C

Donc si vous avez besoin de définir _BSD_SOURCE ou _SVID_SOURCE, il vous suffit de définir _DEFAULT_SOURCE trop. la glibc les versions <= 2.18 ne pas s'en soucier et les versions >= 2.19 ne pas avertir si les deux ou tous les trois sont définis.

14
répondu cremno 2016-03-28 17:39:06

j'ai besoin de portabilité au-delà de linux et de glibc, et je n'aime pas les #ifdef. so:

/* asprintf() does not appear on linux without this */
#define _GNU_SOURCE

/* gettimeofday() does not appear on linux without this. */
#define _BSD_SOURCE

/* modern glibc will complain about the above if it doesn't see this. */
#define _DEFAULT_SOURCE
1
répondu Paul Vixie 2018-01-16 04:56:20