부스트 템플릿 함수를 사용하여 충돌하는 매크로 이름을 해결하는 가장 좋은 방법은 무엇입니까? 템플릿 기능 boost::chrono::round
와시스템 헤더 매크로와 부스트 템플릿 함수 간의 이름 충돌을 해결하는 방법은 무엇입니까?
CCN5816 (W) Too many arguments are specified for the macro "round". The extra arguments are ignored. "/usr/include/math.h", line 2133.16: CCN5425 (I) "round" is defined on line 2133 of "/usr/include/math.h".
round
충돌 : 부스트/chrono.hpp를 포함하면 나는 컴파일러 오류가 발생했습니다.
/usr/include/math.h
#define round(x) __round(x)
/boost/chrono/round.hpp는
namespace boost
{
namespace chrono
{
/**
* rounds to nearest, to even on tie
*/
template <class To, class Rep, class Period>
To round(const duration<Rep, Period>& d)
{
- 내가
#undef
매크로 경우 중 하나를 할 수있는 것 같다 나는 패치를 round.hpp - 어쩌면 나는 parantheses를 사용할 수 있습니까? macro and member function conflict에 대한 응답에서 함수 이름은 괄호 안에 있지만 함수의 용도가 아니라 정의에 사용됩니다. 그것도 정의에서 작동합니까?
BoostChronoTest.cpp 단순히 항상이 <gtest/gtest.h>
<boost/chrono.hpp>
후 포함
#include <gtest/gtest.h>
#include <boost/chrono.hpp>
TEST(BoostChronoTest, simpleTests) {
boost::chrono::nanoseconds ns(12000);
// conversion with precision loss requires a cast
boost::chrono::microseconds ms = boost::chrono::duration_cast<boost::chrono::microseconds>(ns);
// no precision loss
boost::chrono::nanoseconds ns2 = ms;
ms++;
ms += boost::chrono::duration_cast<boost::chrono::microseconds>(ns);
ns *= 2;
EXPECT_TRUE(ms > ns);
EXPECT_EQ(ms, boost::chrono::microseconds(25));
EXPECT_EQ(ns, boost::chrono::nanoseconds(24000));
EXPECT_EQ(ns2, boost::chrono::microseconds(12));
EXPECT_EQ(ns2, boost::chrono::nanoseconds(12000));
}
하, 이것은 매크로를 사용하지 않는 이유는 고전적인 예제처럼 보이지만, 표준 라이브러리를 말할 수는 없지만 ... – Downvoter
@Downvoter 실제로 라이브러리 작성자의 부분에서 그런 나쁜 형태로 파괴 할 수 있습니다. '둥근'이라는 공통 이름. –