espacios de nombres anónimos y la regla de una definición
¿Estoy violando la Regla de una definición con el siguiente programa?
// 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
y 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
En lo anterior, tenga en cuenta quefoo()
se define en un espacio de nombres anónimo, por lo que espero que cada unidad de traducciónm1.cpp
ym2.cpp
obtendrá su propia versión, por lo que no hay violación de la ODR. Por otra parte,bar()
es simplemente una función en línea antigua que llama a 2 @ diferentfoo
s. Entonces viola la ODR, ¿verdad?
Actualizar Anteriormente tenía macros en la definición defoo
que cambió el valor que devolvió y cada uno dem1
ym2
definió la macro de manera diferente antes de incluirfoo.hpp
. (Y con ese ejemplo anterior,g++
produciría un binario que produjera(i+j)
con un valor diferente al esperado.)Pero, de hecho, este programa viola la ODR incluso si el cuerpo defoo()
es idéntico