我是否违反了以下程序的单一定义规则?
// 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)
的值与您期望的值不同的值。)但实际上,即使该程序的主体foo()
相同,该程序也违反了 ODR。