我不太确定标准中的这一点。假设我有三个这样的文件:
foo.h
#include <iostream>
inline void foo();
void foo()
{
std::cout << "Foo" << std::endl;
}
foo.cpp:
#include "foo.h"
void baz();
int main()
{
baz();
foo();
}
bar.cpp
#include "foo.h"
void baz()
{
foo();
}
现在,foo 的定义将被编译到两个编译单元 foo.o 和 bar.o 中。如果我理解正确的话,拥有内联函数将避免链接器冲突。 G++ 编译并链接这很好,但是使用 clang++ 2.8 我得到这个错误:
/tmp/cc-7RdmYP.o: In function `foo()':
bar.cpp:(.text+0x50): multiple definition of `foo()'
/tmp/cc-LW3id3.o:foo.cpp:(.text+0x50): first defined here
collect2: ld returned 1 exit status
似乎 clang++ 没有将 void foo()
视为内联函数。但是,当我也将 inline 添加到定义中时,它确实可以正常工作。
我是否必须在 void foo()
中添加 inline 以使其被视为内联函数,或者这是一个 clang++ 错误?
最佳答案
很可能您的 clang 使用 C99 内联语义。在C99中,如果你的一个函数没有使用“inline”或者包含“extern”,那么这个定义就是一个“外部定义”,它在程序中只能出现一次。参见 inline in C99 .
在 C++ 中,您的程序没问题。在 Clang SVN 中,此错误已得到修复,您的程序应该可以正常运行。
关于c++ - 内联限定符源于原型(prototype)还是定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4924912/