GCC가 ANSI 및 Pedantic 플래그에서도 C ++에서 Round ()를 사용하는 이유는 무엇입니까?
문제
이 프로그램이 GCC에 따라 컴파일하는 이유가 있습니까? -ansi
그리고 -pedantic
깃발?
#include <cmath>
int main (int argc, char *argv [])
{
double x = 0.5;
return static_cast<int>(round(x));
}
이것은 깨끗하게 컴파일합니다 (심지어 경고 없음) g++ -ansi -pedantic -Wall test.cpp -o test
.
두 가지 문제가 있습니다.
round()
ISO 정보 모드에서 C ++에서 사용할 수 있어서는 안됩니다 (C99에서 나온 이후)- 설사
round()
이 경우에만 사용할 수 있었으며std
네임 스페이스
내가 잘못?
해결책
이것은 버그입니다. 놀랍게도 오랫동안 주변에있었습니다. 분명히, 그것을 고치려는 집단적 욕구는 충분하지 않았다. 모퉁이에 C ++의 새로운 버전이 Math.h의 C99 기능을 채택 할 수있게되면 수정되지 않은 것 같습니다.
다른 팁
여기에 기본이 될 수 있지만 GCC의 -ANSI 플래그는 코드 구성에 적용되지 않습니다 (예 : GCC 비활성화 언어 확장) 모든 라이브러리를 엄격한 ANSI 호환 모드로 전환하는 대신?
표준은 정의되어야하는 기호와 그들이 어떤 헤더에 정의되는지를 지정한다고 생각합니다. 나는 다른 기호가 정의 될 수 없다고 표준에 대해서는 믿지 않는다. 요점에 더, std::round()
호출 된 자유 기호로 정의되지 않습니다 round()
정의 할 수 있습니다.
제휴하지 않습니다 StackOverflow