xem xét tập tin này, first.cpp
, chứa một định nghĩa lớp và sử dụng:Tại sao liên kết ld cho phép nhiều định nghĩa lớp có cùng phương pháp?
#include <iostream>
struct Foo
{
Foo(){ std::cout << "Foo()" << std::endl; }
~Foo(){ std::cout << "~Foo()" << std::endl; }
};
int main(){
Foo f;
return 0;
}
và khác, second.cpp
, chứa một định nghĩa lớp mâu thuẫn:
#include <iostream>
struct Foo
{
Foo();
~Foo();
};
Foo::~Foo(){ std::cout << "wrong ~Foo()" << std::endl; }
Các mối liên kết phàn nàn về những biểu tượng trùng lặp khi có hai các hàm có cùng tên được xác định, nhưng những tệp này có các phương thức lớp trùng lặp biên dịch mà không có lỗi.
tôi biên soạn với các lệnh:
$ g++ -c second.cpp -o second
$ g++ second first.cpp -o first
Sắp xếp lại các đối số thứ hai g++
cuộc gọi không thay đổi sản lượng.
Và khi first
đang chạy, đây là kết quả:
$ ./first
Foo()
wrong ~Foo()
Tại sao mối liên kết cho phép các phương thức lớp trùng lặp? Nếu nó được cho phép, tại sao là wrong ~Foo()
được in?
Tôi nghĩ rằng nó phụ thuộc vào phiên bản của trình biên dịch, nhưng phải mất một trong những đầu tiên mà nó tìm thấy. – Brady
Đó là GCC 4.6.1. –
Nó có thể là một cái gì đó để làm với chức năng inlining nhường chỗ cho một chức năng tập tin đối tượng mà nó hiện diện. Tôi đoán bạn sẽ có cùng một vấn đề với các nhà xây dựng nếu bạn tuyên bố một phiên bản không inline trong second.cpp và vấn đề sẽ biến mất nếu cả hai nguồn tuyên bố các chức năng nội tuyến. – forsvarir