web-dev-qa-db-fra.com

`cosf`,` sinf`, etc. ne sont pas dans `std`

Sur la base de la discussion ici, j'ai a signalé un bogue aux développeurs Ubuntu.


Lors de la compilation de l'exemple de programme c ++ suivant:

#include <cmath>
#include <stdio.h>

int main()
{
    printf("%f\n", std::cosf(0.0f));
}

Je reçois le message d'erreur suivant: error: ‘cosf’ is not a member of ‘std’

Comprenant math.h et l'utilisation de la version sans espace de nom fonctionne très bien. Que se passe-t-il?

J'utilise g ++ 8.3.0-6ubuntu1 sur Ubuntu 19.04.

Je construis avec g++ --std=c++17 test.cpp

14
Brennan Vincent

Cette version de la bibliothèque ( libstdc ++ 8 ) n'est pas entièrement conforme à C++ 17. L'avis de droit d'auteur indique qu'il a été mis à jour pour la dernière fois en 2016. En juin 2019, la dernière version en amont est buggé. Il a une section #if __cplusplus > 201402L, Mais il ne déclare pas les identifiants requis par C++ 17. Il y a un rapport de bogue ouvert.

En regardant /usr/include/c++/8/cmath Sur Ubuntu, il inclut <math.h>, Indéfinit une série de macros pour ses fonctions (requises par la bibliothèque standard C) pour accéder à leurs noms, importe cos, acos, etc. dans l'espace de noms std::, puis déclare les surcharges float et long double surchargées comme inline.

Il ne déclare jamais cosf dans l'espace de noms std::, Même si C++ 17 le dit. Le norme C++ 11 dit , "Les noms définis comme fonctions en C doivent être définis comme des fonctions dans la bibliothèque standard C++" et "Chaque nom de la bibliothèque Standard C déclaré avec une liaison externe est réservé à l'implémentation pour être utilisé comme nom avec extern "C" liaison, à la fois dans namespace std et dans l'espace de noms global. " Cependant, il n'indique pas explicitement que std::expf Et al. doit être pris en charge jusqu'à P0175r1 en juin 2016. Il s'agit apparemment d'un oubli.

La bibliothèque libc ++ les déclare, donc la compilation avec clang++ -std=c++17 -stdlib=libc++ Devrait fonctionner.

10
Davislor