103 votes

M_PI fonctionne avec math.h mais pas avec cmath dans Visual Studio

Je suis à l'aide de Visual Studio 2010. J'ai lu qu'en C++, il est préférable d'utiliser <cmath> plutôt que d' <math.h>.

Mais dans le programme que je suis en train d'écrire (application console Win32, projet vide) si j'écris:

#define _USE_MATH_DEFINES
#include <math.h>

il compile, alors que si j'écris

#define _USE_MATH_DEFINES
#include <cmath>

il échoue avec l'

error C2065: 'M_PI' : identificateur non déclaré

Est-il normal? Importe-t-il si j'utilise cmath ou les mathématiques.h? Si oui, comment puis-je le faire fonctionner avec cmath?

Mise à JOUR: si j'définir _USE_MATH_DEFINES dans l'interface graphique, il fonctionne. Aucune idée de pourquoi ce qui se passe?

125voto

Goz Points 35007

Il est intéressant de noter que j'ai vérifié cela sur une application de mine et j'ai eu le même message d'erreur.

J'ai passé un moment de la vérification par les en-têtes pour voir si il n'y avait rien du fnud qui pratiquent la _USE_MATH_DEFINES et n'a rien trouvé.

J'ai donc déplacé le

#define _USE_MATH_DEFINES
#include <cmath>

pour être la première chose dans mon dossier (je n'utilise pas PCHs donc, si vous êtes, vous avez de l'avoir après le #include "stdafx.h") et tout à coup, il compile parfaitement.

Essayez de le déplacer plus haut dans la page. Totalement incertain quant à pourquoi cela causerait des problèmes cependant.

Edit: Compris. Le #include se produit à l'intérieur de cmath en-tête de la garde. Cela signifie que quelque chose de plus élevé de la liste des #inclut notamment cmath sans le #define spécifié. les mathématiques.h est spécialement conçu de sorte que vous pouvez inclure à nouveau avec qui définissent maintenant changé pour ajouter M_PI etc. Ce n'est PAS le cas avec cmath. Ainsi, vous devez vous assurer que vous #define _USE_MATH_DEFINES avant de vous inclure quoi que ce soit d'autre. J'espère que efface en place pour vous :)

À défaut, il suffit d'inclure math.h vous êtes en utilisant non-standard C/C++ comme l'a déjà souligné :)

Edit 2: Ou comme David points dans les commentaires juste faire vous-même une constante qui définit la valeur et que vous avez quelque chose de plus portable de toute façon :)

16voto

Thinkeye Points 93

Pensez à ajouter le commutateur / D_USE_MATH_DEFINES à votre ligne de commande de compilation ou à définir la macro dans les paramètres du projet. Cela fera glisser le symbole sur tous les coins sombres accessibles des fichiers d'inclusion et source, laissant votre source propre pour plusieurs plates-formes. Si vous le définissez globalement pour l'ensemble du projet, vous ne l'oublierez pas plus tard dans un nouveau fichier.

11voto

rubenvb Points 27271

Cela fonctionne pour moi:

 #define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>

using namespace std;

int main()
{
    cout << M_PI << endl;

    return 0;
}
 

Compile et imprime pi comme cela devrait: cl /O2 main.cpp /link /out:test.exe .

Il doit y avoir une discordance dans le code que vous avez posté et celui que vous essayez de compiler.

Assurez-vous qu'aucun en-tête précompilé n'est inséré avant votre #define .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X