我已经花了几天时间在一个奇怪的问题,并最终发现有两个inline
功能在项目中相同的签名,他们造成了这个问题。为了简化这里的情况就是一个例子:两个CPP文件:如果重新定义内联函数会怎样?
a.cpp
#include <iostream>
void b();
inline void echo()
{
std::cout << 0 << std::endl;
}
int main()
{
echo();
b();
return 0;
}
和b.cpp
#include <iostream>
inline void echo()
{
std::cout << 1 << std::endl;
}
void b()
{
echo();
}
请注意:inline
功能echo
具有相同签名但不同实现。编译并运行
g++ a.cpp b.cpp -o a.out && ./a.out
或者这样
g++ a.cpp -c
g++ b.cpp -c
g++ a.o b.o -o a.out
./a.out
它打印0 0
。 (我用的是G ++ 4.6.1是什么,以及我铿锵++ 2.9,相同的结果测试)
如果开启优化,像
g++ -O3 a.cpp b.cpp -o a.out && ./a.out
这是0 1
这个时候,就不会发生。
我的问题是,无论结果如何或编译如何执行,都没有错误甚至是警告我已多次定义了inline
函数。编译器和链接器在这种情况下究竟发生了什么?
编辑:
采取目标文件
nm a.o b.o | c++filt
两个文件都记录在echo()
看看符号。所以我认为问题发生在链接时。难道说链接器会随机选择一个实现并丢弃所有其他实现吗?
你有没有试过更高级的警告(-Wall等)? – schnaader
我刚刚尝试过'-Wall -Wextra',仍然没有任何警告。 – neuront