114 votes

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

J'utilise Visual Studio 2010. J'ai lu qu'en C++ il est préférable d'utiliser <cmath> plutôt que <math.h> .

Mais dans le programme que j'essaie 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

erreur C2065 : 'M_PI' : identifiant non déclaré

Est-ce normal ? Est-ce que cela a de l'importance si j'utilise cmath ou math.h ? Si oui, comment puis-je le faire fonctionner avec cmath ?

UPDATE Si je définis _USE_MATH_DEFINES dans l'interface graphique, cela fonctionne. Avez-vous une idée de la raison pour laquelle cela se produit ?

0 votes

Vos fichiers sources sont-ils .c ou .cpp ?

1 votes

Suisse : cela ne devrait pas avoir d'importance ici.

0 votes

Très étrange... Je peux confirmer que j'ai le même problème avec VS2010 ... je cherche ce qui empêche la définition de passer ... il doit être undef'd quelque part ... mais je n'arrive pas à trouver où.

1voto

alexolut Points 615

Selon la documentation de Microsoft sur Constantes mathématiques :

Le dossier ATLComTime.h comprend math.h lorsque votre projet est construit en mode Release. Si vous utilisez une ou plusieurs des constantes mathématiques dans un projet qui inclut aussi ATLComTime.h vous devez définir _USE_MATH_DEFINES avant d'inclure ATLComTime.h .

Fichier ATLComTime.h peuvent être inclus indirectement dans votre projet. Dans mon cas, un ordre d'inclusion possible était le suivant :

du projet "stdafx.h"<afxdtctl.h><afxdisp.h><ATLComTime.h><math.h>

0 votes

Ceci peut expliquer pourquoi /Y- (désactiver stdafx.h) résoudrait le problème, cependant il reste à expliquer pourquoi fournir -D_USE_MATH_DEFINES dans les paramètres par défaut du compilateur ne suffit pas à résoudre le problème... Comme la compilation s'est faite via la commande mex de Matlab pour mon propre problème, ce n'est pas si évident à repérer...

1voto

JasonDiplomat Points 11

Comme suggéré par l'utilisateur7860670, faites un clic droit sur le projet, sélectionnez les propriétés, naviguez vers C/C++ -> Préprocesseur et ajoutez _USE_MATH_DEFINES aux définitions du préprocesseur.

C'est ce qui a marché pour moi.

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