анонимные пространства имен и одно определение правила
Нарушаю ли я правило единого определения в следующей программе?
// 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
и наконец
// 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
Обратите внимание на то, чтоfoo()
определяется в анонимном пространстве имен, поэтому я ожидаю, что каждая единица переводаm1.cpp
а такжеm2.cpp
получит собственную версию, поэтому нарушения ODR нет. С другой стороны,bar()
это просто старая встроенная функция, которая вызывает 2 разныхfoo
s. Так что это нарушает ODR, верно?
Обновить: Ранее у меня были макросы в определенииfoo
что изменило возвращаемое значение и каждый изm1
а такжеm2
определил макрос по-разному перед включениемfoo.hpp
, (И с этим предыдущим примером,g++
будет производить двоичный файл, который выводит(i+j)
со значением, отличным от того, что вы ожидаете.)Но на самом деле эта программа нарушает ODR, даже если телоfoo()
идентичен