Używam Visual Studio 2010. Czytałem, że w C ++ lepiej jest używać <cmath>
niż <math.h>
.
Ale w programie próbuję pisać (aplikacja konsoli Win32, pusty projekt) jeśli napiszę:
#define _USE_MATH_DEFINES
#include <math.h>
kompiluje się, gdy piszę
#define _USE_MATH_DEFINES
#include <cmath>
to zawodzi
błąd C2065: „M_PI”: niezadeklarowany identyfikator
Jest to normalne? Czy to ma znaczenie, czy używam cmath czy math.h? Jeśli tak, jak mogę sprawić, by działało z cmath?
UPDATE : jeśli zdefiniuję _USE_MATH_DEFINES w GUI, to działa. Jakieś wskazówki, dlaczego tak się dzieje?
c++
visual-studio
visual-studio-2010
hyperknot
źródło
źródło
Odpowiedzi:
Co ciekawe, sprawdziłem to w mojej aplikacji i otrzymałem ten sam błąd.
Spędziłem trochę czasu sprawdzając nagłówki, aby zobaczyć, czy coś jest niezdefiniowane
_USE_MATH_DEFINES
i nic nie znalazłem.Więc przeniosłem
#define _USE_MATH_DEFINES #include <cmath>
być pierwszą rzeczą w moim pliku (nie używam PCH, więc jeśli jesteś, będziesz musiał to mieć po
#include "stdafx.h"
) i nagle kompiluje się idealnie.Spróbuj przenieść go wyżej w górę strony. Zupełnie nie jestem pewien, dlaczego mogłoby to powodować problemy.
Edycja : rozgryzłem to.
#include <math.h>
Zachodzi wewnątrz nagłówka cmath za strażników. Oznacza to, że coś znajdującego się wyżej na liście #includes jest włączaniecmath
bez#define
określonego.math.h
jest specjalnie zaprojektowany, aby można go było ponownie dołączyć do definicji, teraz zmieniono na dodanieM_PI
itd. NIE jest to przypadekcmath
. Dlatego musisz się upewnić,#define _USE_MATH_DEFINES
zanim dołączysz cokolwiek innego. Mam nadzieję, że to wyjaśnia wszystko :)Jeśli to nie wystarczy
math.h
, używasz niestandardowego C / C ++, jak już wspomniano :)Edycja 2 : Lub jak wskazuje David w komentarzach, po prostu stwórz sobie stałą, która definiuje wartość, a i tak masz coś bardziej przenośnego :)
źródło
stdafx.h
jest problemem PO, z którym miałem do czynienia już wcześniej.const static double
raczej niż wartością zdefiniowaną.Rozważ dodanie przełącznika / D_USE_MATH_DEFINES do wiersza poleceń kompilacji lub zdefiniowanie makra w ustawieniach projektu. Spowoduje to przeciągnięcie symbolu do wszystkich osiągalnych ciemnych rogów plików dołączanych i źródłowych, pozostawiając źródło czyste na wielu platformach. Jeśli ustawisz go globalnie dla całego projektu, nie zapomnisz go później w nowym pliku (ach).
źródło
mex -D_USE_MATH_DEFINES
)./Y-
Pomogło tylko dodanie czegoś w jakimś pliku meksykańskim Matlaba ...To działa dla mnie:
#define _USE_MATH_DEFINES #include <cmath> #include <iostream> using namespace std; int main() { cout << M_PI << endl; return 0; }
Kompiluje i drukuje
pi
podobny powinien:cl /O2 main.cpp /link /out:test.exe
.Musi istnieć niezgodność w opublikowanym kodzie i tym, który próbujesz skompilować.
Upewnij się, że nie ma żadnych prekompilowanych nagłówków, które są pobierane przed
#define
.źródło
Jest to nadal problem występujący w VS Community 2015 i 2017 podczas tworzenia aplikacji na konsolę lub Windows. Jeśli projekt jest tworzony z prekompilowanymi nagłówkami, prekompilowane nagłówki są najwyraźniej ładowane przed którymkolwiek z #includes, więc nawet jeśli #define _USE_MATH_DEFINES jest pierwszą linią, nie zostanie skompilowany. # Włączanie math.h zamiast cmath nie robi różnicy.
Jedyne rozwiązania, które mogę znaleźć, to albo zacząć od pustego projektu (dla prostej konsoli lub aplikacji systemu wbudowanego), albo dodać / Y- do argumentów wiersza poleceń, co wyłącza ładowanie prekompilowanych nagłówków.
Aby uzyskać informacje na temat wyłączania prekompilowanych nagłówków, zobacz na przykład https://msdn.microsoft.com/en-us/library/1hy7a92h.aspx
Byłoby miło, gdyby MS to zmieniło / naprawiło. Prowadzę wstępne kursy programowania na dużym uniwersytecie i wyjaśniam to początkującym, dopóki nie popełnią błędu i nie zmagają się z nim przez jakieś popołudnie.
źródło
_USE_MATH_DEFINES
należy zdefiniować przed dołączeniem jakichkolwiek nagłówków. Zwykle za pomocą ustawień projektu lub nagłówka konfiguracji. Błędem jest zakładanie, że zwykłe umieszczenie go w pierwszej linii spowoduje, że zostanie zdefiniowany przed wszystkimi nagłówkami.Zgodnie z dokumentacją Microsoft dotyczącą stałych matematycznych :
Plik
ATLComTime.h
może być pośrednio dołączony do twojego projektu. W moim przypadku jedna z możliwych kolejności włączenia była następująca:źródło
-D_USE_MATH_DEFINES
domyślnych ustawień kompilatora nie wystarczy do rozwiązania problemu ... Ponieważ kompilacja była za pomocą polecenia Matlab mex dla mojego własnego problem, śledzenie nie jest takie oczywiste ...Z CMake po prostu by tak było
w
CMakeLists.txt
.źródło
Zgodnie z sugestią użytkownika7860670 kliknij projekt prawym przyciskiem myszy, wybierz właściwości, przejdź do C / C ++ -> Preprocessor i dodaj
_USE_MATH_DEFINES
do definicji preprocesora.To mi się udało.
źródło