2017-02-11 15 views
0

부스트 템플릿 함수를 사용하여 충돌하는 매크로 이름을 해결하는 가장 좋은 방법은 무엇입니까? 템플릿 기능 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)); 
} 
+2

하, 이것은 매크로를 사용하지 않는 이유는 고전적인 예제처럼 보이지만, 표준 라이브러리를 말할 수는 없지만 ... – Downvoter

+0

@Downvoter 실제로 라이브러리 작성자의 부분에서 그런 나쁜 형태로 파괴 할 수 있습니다. '둥근'이라는 공통 이름. –

답변

-1

다음 #define round ...가 부스트 코드에 영향을 미치지 않습니다 그런 식으로.

+0

math.h 또는 cmath를 포함하지 않았으므로 gtest.h와 함계해야합니다 (다른 포함 순서를 확인하기 위해 컴파일 할 수 없습니다) –

+0

입력 해 주셔서 감사합니다. 제안을 보내 주시면 의견을 남기시 고 의견을 남깁니다. 일한 –