C++ Standard 17.6.1.2 paragraphe 4 (l'emphase est mienne):
Sauf comme il est indiqué dans les paragraphes 18 à 30 et à l'Annexe D, le contenu de chaque en-tête de cname
doit être le même que celui de l'en-tête correspondante name.h
, comme indiqué dans la bibliothèque Standard C (1.2) ou le C Unicode TR, selon le cas, comme si par inclusion. Dans la norme C++ de la bibliothèque, toutefois, les déclarations (sauf pour les noms qui sont définis comme des macros en C) sont dans l'espace de noms de la portée (3.3.6) de l'espace de noms std
. Il n'est pas précisé si ces noms sont d'abord déclarés dans l'espace de noms global de la portée et sont ensuite injectés dans l'espace de noms std
explicites à l'aide de déclarations (7.3.3).
g++ est-il la dernière méthode, de sorte que certains des mêmes fichiers d'en-tête peuvent être réutilisés pour le C et le C++. Donc g++ est autorisé à déclarer et définir double log(double)
en l'espace de noms global.
Section 17.6.4.3.3 paragraphes 3 et 4:
Chaque nom de la bibliothèque Standard C déclarée avec une liaison externe est réservé à la mise en œuvre de l'utiliser comme un nom avec extern "C"
de l'assemblage, à la fois dans l'espace de noms std
et dans l'espace de noms global.
Chaque signature de fonction de la bibliothèque Standard C déclarée avec une liaison externe est réservé à la mise en œuvre de l'utiliser comme une signature de fonction avec deux extern "C"
et extern "C++"
de l'assemblage, ou comme un nom d'espace de noms de champ dans l'espace de noms global.
Et jusqu'en haut de la Section 17.6.4.3 paragraphe 2:
Si un programme déclare ou définit un nom dans un contexte où il est réservé, autres que celles explicitement autorisées par la présente Clause, son comportement est indéfini.
Vous, en revanche, peuvent ne pas déclarer ou de définir des ::log
, en quelque sorte.
Il est dommage que le g++ toolchain ne vous donne pas tous les messages d'erreur, si.