2017-02-11 17 views
0

Каков наилучший способ разрешить конфликтующее имя макроса с помощью функции форматирования? После включения наддува/chrono.hpp я получил ошибку компилятора:Как разрешить конфликт имен между макросом заголовка системы и функцией шаблона повышения?

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 конфликты с помощью функции шаблона boost::chrono::round.

/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 макрос, если I patch round.hpp
  • Может быть, я могу использовать скобки? В ответе macro and member function conflict имя функции находится в круглых скобках, но это используется в функции, а не в ее определении. Будет ли это работать и в определении?

BoostChronoTest.cpp

#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

Просто всегда включая <gtest/gtest.h>после<boost/chrono.hpp>: что таким образом #define round ... не будет влиять код наддува.

+0

Я не включил math.h или cmath, они должны прийти с gtest.h (я не могу скомпилировать сейчас, чтобы проверить, что другой заказ включает) –

+0

Спасибо за ваш вклад, я попробую ваши предложения и оставьте комментарий, если он работал –