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

나는 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이의 경우 NOT 등등 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를 참조하십시오.

MS가 이것을 변경 / 수정하면 좋을 것입니다. 나는 큰 대학에서 입문 프로그래밍 과정을 가르치고 있으며, 초보자들에게 이것을 설명하는 것은 그들이 실수를 저지르고 오후 정도의 어려움을 겪을 때까지 결코 빠져들지 않습니다.


답변

수학 상수 에 대한 Microsoft 문서에 따르면 :

이 파일 ATLComTime.h에는 math.h프로젝트가 릴리스 모드에서 빌드 된 경우가 포함 됩니다. 을 포함하는 프로젝트에서 하나 이상의 수학 상수를 사용하는 경우 포함 하기 전에 ATLComTime.h정의해야합니다 ._USE_MATH_DEFINESATLComTime.h

파일 ATLComTime.h이 프로젝트에 간접적으로 포함될 수 있습니다. 제 경우에는 다음과 같은 순서를 포함 할 수 있습니다.

프로젝트의 "stdafx.h"<afxdtctl.h><afxdisp.h><ATLComTime.h><math.h>


답변

CMake를 사용하면

add_compile_definitions(_USE_MATH_DEFINES)

에서 CMakeLists.txt.


답변

user7860670이 제안한대로 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택한 다음 C / C ++-> 전처리기로 이동 _USE_MATH_DEFINES하여 전 처리기 정의에 추가 합니다.

그게 저에게 효과적이었습니다.