bupjae   4년 전

M_PI 는 C/C++ 표준이 아닙니다. 컴파일러에 따라 #define 으로 정하는 놈들도 있고, 정의 안 하는 놈들도 있고, 무슨 이상한 옵션 넣어야 정의하는 놈도 있고, 자기 멋대로 입니다

원주율 상수를 사용하고 싶으면 M_PI 는 거들떠 보지도 말고 다른 이름으로 스스로 정의해서 사용하는 걸 추천합니다.

kipa00   4년 전

쓰신 코드가 비표준인 것 같습니다.

cppreference의 어디에도 acos가 포함된 코드를 constexpr로 평가하게 하는 type signature가 없습니다. 따라서, 표준은 7번째 줄의 acos(-1)을 상수로 평가할 수 없도록 하고 있습니다.

g++에서는 위 코드를 컴파일합니다.

표준에 맞게 PI를 쓰고 싶으면 실행 시간에 acos(-1)을 한 번만 호출하거나, 외우는 것이 가장 간단한 방법인 것 같습니다.

bupjae   4년 전

반성하겠습니다 

kipa00   4년 전

정정합니다:

constexpr이 아니고 const object이기 때문에 쓰신 코드는 C++에서 표준입니다.

C에서는 static object는 const expression이어야 하기 때문에 비표준입니다.

const expression이 아니기 때문에, 컴파일 타임에 상수로 컴파일할 수는 없습니다.

저도 제대로 알아보지 않고 지적 댓글을 단 점에 대해 반성하겠습니다. 해당 코드를 살려 놓겠습니다.

C/C++에 익숙하지 않으신 분들은 표준이 이렇게 어렵구나, M_PI는 사용하지 않는 것이 좋겠구나 하는 정도로 알아가시면 좋겠습니다.

댓글을 작성하려면 로그인해야 합니다.