2012-02-09 35 views
10

Tôi có Lớp khai báo phương thức nhưng không triển khai phương thức đó. Phương thức này không phải là một hàm ảo. Trong tệp cpp tương ứng, tôi không tìm thấy định nghĩa của cùng một phương thức. Tất cả các phương thức khác được khai báo trong lớp đã được định nghĩa.Phương thức được khai báo trong Lớp nhưng không được xác định

Tôi đã biên dịch mã và nó ổn. Tôi đã có ấn tượng rằng cpp phải ủy quyền định nghĩa của một phương thức được khai báo.

Đánh giá cao nếu ai đó có thể xây dựng tương tự. Tôi đang sử dụng trình biên dịch cl từ VS2010.

Trả lời

10

Mã của bạn sẽ biên dịch nhưng mã sẽ cung cấp lỗi liên kết.

Xây dựng một thực thi của dự án của bạn liên quan đến hai giai đoạn:

  • Compilation
  • Linking

Trong Compilation trình biên dịch chỉ đơn thuần là dịch mã nguồn thành mã đối tượng bằng cách kiểm tra ngữ nghĩa ngôn ngữ .
Trong khi Liên kết trình liên kết thực sự tìm kiếm các định nghĩa của biểu tượng và tạo tệp thực thi từ nhiều tệp đối tượng (được tạo trong quá trình biên dịch).

Trình biên dịch biên dịch mã nguồn trong mỗi đơn vị dịch (.cpp + tệp tiêu đề) một cách riêng biệt và do đó nó giả định định nghĩa phải có mặt trong một số tệp nguồn khác. Nó là Linker, người cố gắng tìm các tham chiếu đến các định nghĩa hàm, và do đó định nghĩa bị thiếu sẽ được báo cáo bởi trình liên kết.

Lưu ý rằng các mối liên kết cần phải liên kết chỉ những biểu tượng đó là sử dụng bởi chương trình của bạn,
Đối với ví dụ: Nếu chương trình của bạn tuyên bố một chức năng, cung cấp không có định nghĩa & sau đó không bao giờ sử dụng/gọi chức năng ở bất cứ đâu, trình liên kết không cần nhúng mã để nhảy tới địa chỉ nơi mã đối tượng của hàm nằm ở bất kỳ trang web gọi hàm nào.
Với trường hợp như vậy, trình liên kết sẽ không bao giờ cần tìm kiếm định nghĩa hàm. Do đó mã sẽ biên dịch và liên kết.

+5

IMHO, Lỗi liên kết sẽ chỉ xảy ra nếu hàm thiếu định nghĩa đang được sử dụng/được gọi rõ ràng/ngầm ở đâu đó. – fizzbuzz

+0

@fizzbuzz: Có, ofcourse. Đó là tiêu chí cơ bản. –

+0

Tôi không nhận được bất kỳ lỗi biên dịch hoặc liên kết nào. Chỉ cần thêm tôi không sử dụng chức năng ở bất cứ đâu. Mã biên dịch và liên kết tốt thành tệp .lib. – akrohit

3

Không yêu cầu phương pháp được triển khai trong một tệp cụ thể. Thật vậy, nó được (hoặc) được coi là thực hành lập trình tốt để có một tập tin cho mỗi phương pháp để giảm sưng lên khi liên kết với các thư viện. Điều này có nghĩa là đưa ra một tập tin tiêu đề xác định một lớp (và có lẽ không có thực hiện trong nó), trình biên dịch chỉ có thể giả định rằng tất cả các chức năng được thực hiện ở đâu đó. Nó chỉ ở điểm mà hệ thống cố gắng để đặt tất cả mọi thứ lại với nhau (giai đoạn liên kết) mà nó trở nên rõ ràng rằng bạn đang đề cập đến một cái gì đó mà không có ở đó.

+0

Một tệp ** cho ** phương pháp? Có vẻ quá mức ... –

+0

không thực sự. nó làm cho các vấn đề liên kết ít phiền toái và đáng ngạc nhiên hơn nhiều. Một số trình biên dịch hiện đại làm cho điều đó không cần thiết bằng cách làm cho mỗi hàm hoạt động trong một phần đối tượng riêng biệt, nhưng hầu hết không. –

+0

Tôi đã kiểm tra và không thể tìm thấy định nghĩa của phương pháp tôi đang nói ở trên trong bất kỳ tệp nào khác. – akrohit

3

Đây là một kỹ thuật phổ biến để ngăn việc chuyển nhượng hoặc sao chép. Nếu bạn khai báo nhưng không xác định, lỗi liên kết sẽ xảy ra nếu bạn cố gắng sử dụng nó, nghĩa là ngăn người dùng vô tình sử dụng nó

0

Trình biên dịch không phàn nàn vì không có lỗi cú pháp/biên dịch. Trình liên kết không khiếu nại vì bạn không gọi hàm trong chương trình của bạn để nó không cần phải được liên kết.

Các vấn đề liên quan