Une macro de préprocesseur appelée _GLIBCXX_USE_NANOSLEEP apparaît dans deux fichiers d'en-tête standard :
- c++/4.7.1/x86_64-unknown-linux-gnu/bits/c++config.h
- c++/4.7.1/thread
Dans une version par défaut de GCC 4.7.1 (Linux, 64 bits), la seule chose que l'on peut constater est que l'on n'a pas besoin d'utiliser le logiciel. c++config.h ce commentaire en inclut un autre :
/* Defined if nanosleep is available. */
/* #undef _GLIBCXX_USE_NANOSLEEP */
Considérant que dans filetage la définition de std::this_thread::sleep_for()
y std::this_thread::sleep_until()
dépendent de la définition de la macro. Si elle n'est pas définie, les deux fonctions - bien que requises par la norme C++ - ne seront pas non plus définies.
Sur mon système (glibc 2.15), la macro n'est pas définie, bien que la commande nanosleep()
(déclarée dans ctime
) existe et est opérationnel.
J'aimerais savoir de quoi il s'agit et comment y faire face. Plus précisément :
- Existe-t-il une option de configuration qui devrait être utilisée lors de la construction de GCC pour activer cette macro par défaut, comme suggéré par ce poste ? (Je n'en ai pas trouvé dans le documentation en ligne du processus de construction .)
- Y a-t-il vraiment une relation entre le
nanosleep()
et la macro ? La déclaration denanosleep()
enctime
/time.h
ne semble pas dépendre de la macro, ni la définir. - Y a-t-il un risque particulier à définir la macro dans mes propres fichiers d'en-tête, ou en tant qu'une
-D
sur la ligne de commande (comme suggéré dans cette question connexe ) ? Et si je fais cela sur un système oùnanosleep()
n'est pas disponible, et comment puis-je le savoir ?
Mise à jour À partir de GCC 4.8, la prise en charge de l'option std::this_thread::sleep_for()
et autres sont automatiquement inclus dans libstdc++. Aucun drapeau de configuration n'est plus nécessaire. Depuis le journal des modifications de GCC 4.8 :
this_thread::sleep_for(), this_thread::sleep_until() et this_thread::yield() sont définis sans nécessiter l'option de configuration --enable-libstdcxx-time ;
Mais notez les détails supplémentaires à ce sujet pour GCC 4.8 et 4.9 donnés dans la réponse de Jonathan.