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, j'essaye 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>
ça échoue avec
erreur C2065: 'M_PI': identifiant non déclaré
Est-ce normal? Est-ce important que j'utilise cmath ou math.h? Si oui, comment puis-je le faire fonctionner avec cmath?
MISE À JOUR : si je définis _USE_MATH_DEFINES dans l'interface graphique, cela fonctionne. Une idée pourquoi cela se produit?
c++
visual-studio
visual-studio-2010
hyperknot
la source
la source
Réponses:
Fait intéressant, j'ai vérifié cela sur une de mes applications et j'ai eu la même erreur.
J'ai passé un certain temps à vérifier les en-têtes pour voir s'il y avait quelque chose d'indéfaillable
_USE_MATH_DEFINES
et je n'ai rien trouvé.Alors j'ai déplacé le
pour être la première chose dans mon fichier (je n'utilise pas de PCH donc si vous l'êtes vous devrez l'avoir après le
#include "stdafx.h"
) et du coup il se compile parfaitement.Essayez de le déplacer plus haut sur la page. Je ne sais absolument pas pourquoi cela causerait des problèmes.
Edit : compris. Le
#include <math.h>
se produit dans les gardes d'en-tête de cmath. Cela signifie que quelque chose de plus haut dans la liste des #includes est incluscmath
sans le#define
spécifié.math.h
est spécifiquement conçu pour que vous puissiez l'inclure à nouveau avec cette définition maintenant modifiée pour ajouterM_PI
etc. Ce n'est PAS le cas aveccmath
. Vous devez donc vous assurer#define _USE_MATH_DEFINES
avant d'inclure quoi que ce soit d'autre. J'espère que cela clarifie les choses pour vous :)À défaut d'inclure simplement,
math.h
vous utilisez du C / C ++ non standard comme déjà indiqué :)Edit 2 : Ou comme David le souligne dans les commentaires, créez-vous une constante qui définit la valeur et vous avez de toute façon quelque chose de plus portable :)
la source
stdafx.h
c'est le problème des OP que j'ai déjà rencontré ce comportement.const static double
plutôt qu'une # valeur définie.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 vers 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 ou plusieurs nouveaux fichiers.
la source
mex -D_USE_MATH_DEFINES
). L'ajout de/Y-
smewhere dans certains fichiers mexoptions Matlab a aidé ...Cela fonctionne pour moi:
Compile et estampes
pi
comme I devraient:cl /O2 main.cpp /link /out:test.exe
.Il doit y avoir une incompatibilité entre le code que vous avez publié et celui que vous essayez de compiler.
Assurez-vous qu'aucun en-tête précompilé n'est extrait avant votre fichier
#define
.la source
C'est toujours un problème dans VS Community 2015 et 2017 lors de la création d'applications console ou Windows. Si le projet est créé avec des en-têtes précompilés, les en-têtes précompilés sont apparemment chargés avant l' un des #includes, donc même si le #define _USE_MATH_DEFINES est la première ligne, il ne sera pas compilé. #incluant math.h au lieu de cmath ne fait aucune différence.
Les seules solutions que je peux trouver sont soit de partir d'un projet vide (pour une console simple ou des applications système embarquées), soit d'ajouter / Y- aux arguments de la ligne de commande, ce qui désactive le chargement des en-têtes précompilés.
Pour plus d'informations sur la désactivation des en-têtes précompilés, voir par exemple https://msdn.microsoft.com/en-us/library/1hy7a92h.aspx
Ce serait bien que MS modifie / corrige cela. J'enseigne des cours d'introduction à la programmation dans une grande université, et expliquer cela aux débutants ne se résume jamais tant qu'ils n'ont pas commis l'erreur et se sont débattus avec elle pendant environ un après-midi.
la source
_USE_MATH_DEFINES
doit être défini avant d'inclure des en-têtes. Généralement via les paramètres du projet ou via l'en-tête de configuration. Il est faux de supposer que le simple fait de le mettre à la première ligne entraînera sa définition avant tous les en-têtes.Selon la documentation Microsoft sur les constantes mathématiques :
Le fichier
ATLComTime.h
peut être inclus indirectement dans votre projet. Dans mon cas, un ordre possible d'inclusion était le suivant:la source
-D_USE_MATH_DEFINES
dans les paramètres par défaut du compilateur ne suffit pas pour résoudre le problème ... Puisque la compilation s'est faite via la commande Matlab mex pour la mienne problème, ce n'est pas si évident de suivre ...Comme suggéré par user7860670, cliquez avec le bouton droit sur le projet, sélectionnez les propriétés, accédez à C / C ++ -> Préprocesseur et ajoutez
_USE_MATH_DEFINES
aux définitions de préprocesseur.C'est ce qui a fonctionné pour moi.
la source
Avec CMake, ce serait juste
dans
CMakeLists.txt
.la source