Ich verwende Visual Studio 2010. Ich habe gelesen, dass es in C ++ besser ist, <cmath>
als zu verwenden <math.h>
.
Aber im Programm versuche ich zu schreiben (Win32-Konsolenanwendung, leeres Projekt), wenn ich schreibe:
#define _USE_MATH_DEFINES
#include <math.h>
es kompiliert, während wenn ich schreibe
#define _USE_MATH_DEFINES
#include <cmath>
es scheitert mit
Fehler C2065: 'M_PI': nicht deklarierter Bezeichner
Es ist normal? Ist es wichtig, ob ich cmath oder math.h verwende? Wenn ja, wie kann ich es mit cmath zum Laufen bringen?
UPDATE : Wenn ich _USE_MATH_DEFINES in der GUI definiere, funktioniert es. Irgendein Hinweis, warum dies geschieht?
c++
visual-studio
visual-studio-2010
Hyperknoten
quelle
quelle
Antworten:
Interessanterweise habe ich dies in einer meiner Apps überprüft und den gleichen Fehler erhalten.
Ich habe eine Weile in den Headern nachgesehen, um
_USE_MATH_DEFINES
festzustellen, ob etwas undefiniert war, und nichts gefunden.Also habe ich die bewegt
um das erste in meiner Datei zu sein (ich benutze keine PCHs, wenn Sie es sind, müssen Sie es nach dem haben
#include "stdafx.h"
) und plötzlich wird es perfekt kompiliert.Versuchen Sie, es höher auf der Seite zu verschieben. Völlig unsicher, warum dies zu Problemen führen würde.
Edit : Hab es herausgefunden. Das
#include <math.h>
tritt innerhalb der Header-Wachen von cmath auf. Dies bedeutet, dass etwas weiter oben in der Liste der #includescmath
ohne das#define
angegebene enthalten ist.math.h
wurde speziell entwickelt, damit Sie es wieder in die Definition aufnehmen können, die jetzt geändert wurde, um sie hinzuzufügenM_PI
usw. Dies ist bei NICHT der Fallcmath
. Sie müssen sich also vergewissern,#define _USE_MATH_DEFINES
bevor Sie etwas anderes hinzufügen. Hoffe das klärt es für dich auf :)Andernfalls verwenden
math.h
Sie nicht standardmäßiges C / C ++, wie bereits erwähnt :)Edit 2 : Oder wie David in den Kommentaren betont, machen Sie sich einfach zu einer Konstante, die den Wert definiert, und Sie haben sowieso etwas Tragbareres :)
quelle
stdafx.h
ist das OP-Problem, mit dem ich dieses Verhalten zuvor konfrontiert habe.const static double
eher zu einem als zu einem # definierten Wert.Erwägen Sie, den Schalter / D_USE_MATH_DEFINES zu Ihrer Kompilierungsbefehlszeile hinzuzufügen oder das Makro in den Projekteinstellungen zu definieren. Dadurch wird das Symbol in alle erreichbaren dunklen Ecken von Include- und Quelldateien gezogen, sodass Ihre Quelle für mehrere Plattformen sauber bleibt. Wenn Sie es global für das gesamte Projekt festlegen, werden Sie es später in einer neuen Datei nicht vergessen.
quelle
mex -D_USE_MATH_DEFINES
) nicht gelöst hat . Nur das Hinzufügen von/Y-
smewhere in einer Matlab mexoptions-Datei hat geholfen ...Das funktioniert bei mir:
Kompiliert und druckt
pi
wie es sein sollte :cl /O2 main.cpp /link /out:test.exe
.Der von Ihnen veröffentlichte Code und der Code, den Sie kompilieren möchten, müssen nicht übereinstimmen.
Stellen Sie sicher, dass keine vorkompilierten Header vor Ihrem eingezogen werden
#define
.quelle
Dies ist in VS Community 2015 und 2017 immer noch ein Problem, wenn Konsolen- oder Windows-Apps erstellt werden. Wenn das Projekt mit vorkompilierten Headern erstellt wird, werden die vorkompilierten Header anscheinend vor einem der # Includes geladen. Selbst wenn #define _USE_MATH_DEFINES die erste Zeile ist, wird es nicht kompiliert. # Einschließlich math.h anstelle von cmath macht keinen Unterschied.
Die einzigen Lösungen, die ich finden kann, bestehen darin, entweder von einem leeren Projekt aus zu starten (für einfache Konsolen- oder eingebettete System-Apps) oder / Y- zu den Befehlszeilenargumenten hinzuzufügen, wodurch das Laden vorkompilierter Header deaktiviert wird.
Informationen zum Deaktivieren vorkompilierter Header finden Sie beispielsweise unter https://msdn.microsoft.com/en-us/library/1hy7a92h.aspx
Es wäre schön, wenn MS dies ändern / beheben würde. Ich unterrichte einführende Programmierkurse an einer großen Universität, und wenn ich dies Neulingen erkläre, wird dies erst dann deutlich, wenn sie den Fehler gemacht und etwa einen Nachmittag lang damit zu kämpfen haben.
quelle
_USE_MATH_DEFINES
sollte vor dem Einfügen von Headern definiert werden. In der Regel entweder über die Projekteinstellung oder über den Konfigurationsheader. Es ist falsch anzunehmen, dass das einfache Setzen in die erste Zeile dazu führt, dass es vor allen Überschriften definiert wird.Laut Microsoft-Dokumentation zu Math Constants :
Die Datei
ATLComTime.h
kann indirekt in Ihr Projekt aufgenommen werden. In meinem Fall war eine mögliche Reihenfolge der Aufnahme die folgende:quelle
-D_USE_MATH_DEFINES
in den Standard-Compilereinstellungen nicht ausreicht, um das Problem zu lösen ... Da die Kompilierung über den Befehl Matlab mex für mich selbst erfolgte Problem, es ist nicht so offensichtlich zu verfolgen ...Klicken Sie wie von user7860670 vorgeschlagen mit der rechten Maustaste auf das Projekt, wählen Sie Eigenschaften aus, navigieren Sie zu C / C ++ -> Präprozessor und fügen Sie
_USE_MATH_DEFINES
die Präprozessordefinitionen hinzu.Das hat bei mir funktioniert.
quelle