c++ - 内联限定符源于原型(prototype)还是定义?

标签 c++ gcc clang

我不太确定标准中的这一点。假设我有三个这样的文件:

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/

相关文章:

c++ - 如何从实现与其他接口(interface)共享的接口(interface)的类继承

gcc - 链接时 '-lfoo'和 '/path/to/libfoo.so'的区别

铛生成文件 "ar: no archive members specified"

gcc - 与GCC组装会导致关于.data的奇怪的重定位错误

clang - Emscripten 和 Clang 在 WebAssembly 编译方面有什么区别

c++ - 如何使用具有默认值的参数制作函数原型(prototype)?

c++ - 原始类型在 C++ 中也有构造函数吗?

c++ - 将 C++ 双缓冲区传递给 Node Js(直接)[Node JS : V8 c++ : Nan]

c++ - LLVM 编译器 2.0 : Warning with "using namespace std;"

python - 如何将 compile_commands.json 与 clang python 绑定(bind)一起使用?