Qual é a melhor maneira de resolver um nome de macro conflitante com uma função de modelo de aprimoramento? Depois de incluir boost / chrono.hpp, recebi o erro do compilador:
CCN5816 (W) Muitos argumentos são especificados paraa macro "rodada". Os argumentos extras são ignorados. "/usr/include/math.h", linha 2133.16: CCN5425 (I) "round" é definido na linha 2133 de "/usr/include/math.h".
round
conflitos com a função de modelo 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)
{
- Parece que eu posso
#undef
a macro se eu patchear round.hpp - Talvez eu possa usar parantheses? Na resposta para conflito de macro e função de membro o nome da função está entre parênteses, mas isso está no uso da função, não na sua definição. Funcionaria na definição também?
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));
}
Respostas:
-1 para resposta № 1Simplesmente, sempre Incluindo <gtest/gtest.h>
depois de <boost/chrono.hpp>
: dessa forma o #define round ...
Não irá afectar o código de impulso.