namespaces anônimos e a regra de uma definição
Estou violando a regra de definição única com o seguinte program
// foo.hpp
#ifndef FOO_HPP_
#define FOO_HPP_
namespace {
inline int foo() {
return 1;
}
}
inline int bar() {
return foo();
}
#endif
//EOF
// m1.cpp
#include "foo.hpp"
int m1() {
return bar();
}
//EOF
// m2.cpp
#include "foo.hpp"
int m2() {
return bar();
}
//EOF
e finalment
// main.cpp
#include <iostream>
int m1();
int m2();
int main(int, const char* [])
{
int i = m1();
int j = m2();
std::cout << (i+j) << std::endl;
return 0;
}
// EOF
Acima, observe quefoo()
é definido em um espaço para nome anônimo, então espero que cada unidade de traduçãom1.cpp
em2.cpp
terá sua própria versão, portanto não haverá violação do ODR. Por outro lado,bar()
é apenas uma função embutida antiga simples que chama 2 diferentesfoo
s. Então, viola o ODR, certo?
Atualizar Anteriormente, eu tinha macros na definição defoo
que alterou o valor retornado e cada um dosm1
em2
definiu a macro de maneira diferente antes de incluirfoo.hpp
. (E com o exemplo anterior,g++
produziria um binário que produza(i+j)
com um valor diferente do que você esperaria.)Mas, de fato, este programa viola o ODR, mesmo que o corpo defoo()
é idêntico.