programing

M_PI는 math.h에서는 작동하지만 Visual Studio의 cmath에서는 작동하지 않습니다.

nasanasas 2020. 9. 25. 07:56
반응형

M_PI는 math.h에서는 작동하지만 Visual Studio의 cmath에서는 작동하지 않습니다.


나는 C ++에서 그것을 사용하는 것이 낫다는 것을 읽고 Visual Studio 2010에서 Visual Studio 2010을 사용하고 있습니다 <cmath>보다는이 <math.h>.

그러나 프로그램에서 다음과 같이 작성하면 작성하려고합니다 (Win32 콘솔 응용 프로그램, 빈 프로젝트).

#define _USE_MATH_DEFINES
#include <math.h>

컴파일하는 동안 내가 쓰면

#define _USE_MATH_DEFINES
#include <cmath>

그것은 실패한다

오류 C2065 : 'M_PI': 선언되지 않은 식별자

정상인가요? cmath 또는 math.h를 사용하는 것이 중요합니까? 그렇다면 cmath에서 어떻게 작동하도록 할 수 있습니까?

업데이트 : GUI에서 _USE_MATH_DEFINES를 정의하면 작동합니다. 왜 이런 일이 일어나는지 알 수 있습니까?


흥미롭게도 내 앱에서 이것을 확인했는데 동일한 오류가 발생했습니다.

나는 헤더를 통해 undef'ing이 있는지 확인 _USE_MATH_DEFINES하고 아무것도 찾지 못했습니다.

그래서 나는

#define _USE_MATH_DEFINES
#include <cmath>

내 파일의 첫 번째 항목이 되려면 (PCH를 사용하지 않으므로 #include "stdafx.h") 뒤에 있어야 하며 갑자기 완벽하게 컴파일됩니다.

페이지 위로 이동해보십시오. 이것이 문제를 일으키는 이유에 대해 완전히 확신하지 못합니다.

편집 : 그것을 알아 냈습니다. #include <math.h>cmath의 헤더 가드 내에서 발생합니다. 이것은 #includes 목록의 상위에있는 항목 cmath#define지정 되지 않고 포함된다는 것을 의미 합니다. math.h은 (는) 추가 M_PI등으로 변경된 정의와 함께 다시 포함 할 수 있도록 특별히 설계되었습니다 cmath.. 따라서 #define _USE_MATH_DEFINES다른 항목을 포함하기 전에 확인해야합니다 . 그것이 당신을 위해 그것을 정리하기를 바랍니다 :)

math.h이미 지적한대로 비표준 C / C ++를 사용 하고 있다는 것을 포함하지 않으면 :)

편집 2 : 또는 David가 주석에서 지적했듯이 값을 정의하는 상수로 만들고 어쨌든 더 이식 가능한 것이 있습니다 :)


컴파일 명령 줄에 / D_USE_MATH_DEFINES 스위치를 추가하거나 프로젝트 설정에서 매크로를 정의하는 것이 좋습니다. 이렇게하면 포함 및 소스 파일의 도달 할 수있는 모든 어두운 모서리로 심볼을 드래그하여 여러 플랫폼에서 소스를 깨끗하게 유지합니다. 전체 프로젝트에 대해 전체적으로 설정하면 나중에 새 파일에서 잊지 않을 것입니다.


이것은 나를 위해 작동합니다.

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

using namespace std;

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

    return 0;
}

다음과 pi같이 컴파일하고 출력 해야합니다 cl /O2 main.cpp /link /out:test.exe..

게시 한 코드와 컴파일하려는 코드가 일치하지 않아야합니다.

.NET Framework 이전에 가져온 미리 컴파일 된 헤더가 없는지 확인하십시오 #define.


이것은 콘솔 또는 Windows 앱을 빌드 할 때 VS Community 2015 및 2017에서 여전히 문제입니다. 프로젝트가 미리 컴파일 된 헤더로 생성 된 경우 미리 컴파일 된 헤더가 #includes 앞에 로드 되므로 #define _USE_MATH_DEFINES가 첫 번째 줄이더라도 컴파일되지 않습니다. #cmath 대신 math.h를 포함해도 차이가 없습니다.

내가 찾을 수있는 유일한 솔루션은 빈 프로젝트 (간단한 콘솔 또는 임베디드 시스템 앱의 경우)에서 시작하거나 / Y-를 명령 줄 인수에 추가하여 미리 컴파일 된 헤더의로드를 끄는 것입니다.

미리 컴파일 된 헤더 비활성화에 대한 자세한 내용은 https://msdn.microsoft.com/en-us/library/1hy7a92h.aspx를 참조하십시오.

It would be nice if MS would change/fix this. I teach introductory programming courses at a large university, and explaining this to newbies never sinks in until they've made the mistake and struggled with it for an afternoon or so.


According to Microsoft documentation about Math Constants:

The file ATLComTime.h includes math.h when your project is built in Release mode. If you use one or more of the math constants in a project that also includes ATLComTime.h, you must define _USE_MATH_DEFINES before you include ATLComTime.h.

File ATLComTime.h may be included indirectly in your project. In my case one possible order of including was the following:

project's "stdafx.h"<afxdtctl.h><afxdisp.h><ATLComTime.h><math.h>

참고URL : https://stackoverflow.com/questions/6563810/m-pi-works-with-math-h-but-not-with-cmath-in-visual-studio

반응형