2015-03-23 1 views
10

Auparavant, je recevais des avertissements de gcc -std=c99 que usleep() était implicitement déclarée. Puis je suis tombé sur this stackoverflow post, ce qui m'a conduit à utiliser -D_BSD_SOURCE. Cependant, maintenant gcc me dit que -D_BSD_SOURCE a été déprécié et je devrais utiliser -D_DEFAULT_SOURCE à la place.Que fait -D_DEFAULT_SOURCE?

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

Pourquoi -D_BSD_SOURCE est-il déprécié? Pourquoi -D_DEFAULT_SOURCE est-il utilisé à la place? Et que fait-il? J'ai fait some googling, et les résultats sont simplement remplis avec les gens qui l'utilisent pour fermer gcc. Je ne pouvais pas savoir pourquoi-D_BSD_SOURCE a été déprécié, juste que c'est.

+0

Il est arrivé dans [glibc 2.20] (https://sourceware.org/glibc/wiki/Release/2.20#Deprecation_of__BSD_SOURCE_and__SVID_SOURCE_feature_macros). En ce qui concerne ce qu'elle fait, [la documentation de la glibc explique l'effet recherché] (http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html#index-_005fDEFAULT_005fSOURCE). –

+0

La fonction usleep() est définie dans le fichier d'en-tête: unistd.h cependant, par page de manuel, elle est obsolète, et utilise nanosleep à la place. la fonction nanosleep() est définie dans le fichier d'en-tête: time.h aussi, l'étape de liaison. pour gcc, nécessite le paramètre '-lrt' – user3629249

+0

@ user3629249 Cette [page de manuel pour librt] (http://www.unix.com/man-page/opensolaris/3lib/librt/) suggère que 'le développement de nouvelles applications n'a pas besoin de spécifiez -lrt', mais oui je suis passé à nanosleep() maintenant. – ryanmjacobs

Répondre

10

Le glibc manual décrit chaque macro de test de fonctionnalité (FTM) dont _DEFAULT_SOURCE:

Si vous définissez cette macro, la plupart des fonctionnalités sont incluses à part X/Open, extensions EPA et GNU: l'effet est de permettre caractéristiques de l'édition 2008 de POSIX, ainsi que certaines fonctionnalités BSD et SVID sans une macro de test de fonctionnalités distinctes pour les contrôler. Définir cette macro , seule et sans utiliser les options du compilateur telles que -ansi ou -std=c99, a le même effet que de ne définir aucune macro de test de fonctionnalité; le définir avec d'autres macros de test de fonctionnalités, ou lorsque les options telles que -ansi sont utilisées, active ces fonctions même si les autres options les feraient sinon être désactivées.

This LWN.net article à propos FTM nous donne une raison d'être (entre autres informations peut-être intéressant):

L'intention initiale semble avoir été que, dans chacun des fichiers d'en-tête glibc qui emploie FTM, seulement l'une des macros __USE_* internes devrait régir l'exposition de toute définition particulière. En outre, les macros ne doivent pas être utilisées dans les directives #ifdef imbriquées. 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 to suggest qu'il était temps pour un nettoyage majeur de ramener choses à la situation prévue. Roland pensait que cette tâche pouvait être simplifiée en éliminant les FTM _BSD_SOURCE et _SVID_SOURCE, qui, bien qu'ayant historiquement un but, ont cessé d'être utiles ces jours-ci. De plus, at-il dit, les seules macros qui sont nécessaires pour le code source moderne sont celles qui se rapportent aux normes formelles plus _GNU_SOURCE.

Joseph Myers duly obliged avec une série de correctifs pour implémenter les premières étapes dans ce travail. L'approche conservatrice encouragée par Roland signifiait que la dépréciation des FTMs _BSD_SOURCE et _SVID_SOURCE se déroule sur deux versions de la glibc. Version 2.19 de la glibc a ajouté un nouveau FTM, _DEFAULT_SOURCE.La définition de cette macro entraîne l'affichage des définitions par défaut même lorsque la définition explicite d'autres macros ne le permet pas. L'effet de définir cette macro est équivalente à l'effet de définir explicitement trois macros dans les versions antérieures glibc:

cc -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809C 

Donc, si vous devez définir _BSD_SOURCE ou _SVID_SOURCE, il suffit de définir _DEFAULT_SOURCE aussi. Les versions de glibc < = 2.18 ne s'en soucient pas et les versions> = 2.19 ne préviennent pas si les trois ou les trois sont définis.

+0

Bien sûr, la vraie solution est d'éviter le 'usleep' obsolète (si possible) et d'utiliser [' nanosleep'] (http://man7.org/linux/man-pages/man2/nanosleep.2.html) à la place comme la spécification Single Unix n'a pas supprimé cela. –

+3

@ChronoKitsune: Oui, j'avais écrit quelque chose à ce sujet, mais il n'a pas posé de questions sur ce cas précis et donc cela ne s'est pas retrouvé dans la réponse. Et pour utiliser 'nanosleep()' avec '-std = c99', vous devez aussi définir un FTM, mais au moins c'est un POSIX! – cremno

1

J'ai besoin de la portabilité au-delà de Linux et au-delà de la glibc, et je n'aime pas # ifdef. si:

/* 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