Tôi không hoàn toàn chắc chắn về điều này trong các tiêu chuẩn. Nói rằng tôi có ba tác phẩm như thế này:Vòng loại nội tuyến bắt nguồn từ nguyên mẫu hoặc định nghĩa?
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();
}
Bây giờ, định nghĩa cho foo sẽ được biên dịch thành cả hai đơn vị biên dịch foo.o và bar.o. Nếu tôi hiểu nó một cách chính xác, có chức năng nội tuyến sẽ tránh được sự liên kết collition. G ++ biên soạn và các liên kết này chỉ là tốt, nhưng với kêu vang ++ 2.8 Tôi nhận được lỗi này:
/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
Dường như kêu vang ++ không thấy void foo()
như một chức năng inlined. Nó tuy nhiên, làm việc tốt khi tôi thêm nội tuyến để định nghĩa là tốt.
Tôi có phải thêm nội dòng vào void foo()
cũng ở đây để nó được xem là chức năng nội tuyến hay là lỗi clang ++?
Tôi nghĩ bạn có nghĩa là "định nghĩa", không phải "tuyên bố". – Maxpm
À, vâng, tôi có xu hướng trộn những thứ đó ...;) – Maister
Đây là một câu hỏi thú vị. –