анонимные пространства имен и одно определение правила

Нарушаю ли я правило единого определения в следующей программе?

// 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 разныхfoos. Так что это нарушает ODR, верно?

Обновить: Ранее у меня были макросы в определенииfoo что изменило возвращаемое значение и каждый изm1 а такжеm2 определил макрос по-разному перед включениемfoo.hpp, (И с этим предыдущим примером,g++ будет производить двоичный файл, который выводит(i+j) со значением, отличным от того, что вы ожидаете.)Но на самом деле эта программа нарушает ODR, даже если телоfoo() идентичен

Ответы на вопрос(2)

Ваш ответ на вопрос