2009-05-28 45 views
39

Trong khi biên soạn với avr-gcc Tôi đã gặp phải lỗi mối liên kết như sau:Mục đích của __cxa_pure_virtual là gì?

undefined reference to `__cxa_pure_virtual' 

tôi đã tìm thấy this document trong đó nêu:

The __cxa_pure_virtual function is an error handler that is invoked when a pure virtual function is called.

If you are writing a C++ application that has pure virtual functions you must supply your own __cxa_pure_virtual error handler function. For example:

extern "C" void __cxa_pure_virtual() { while (1); }

Xác định chức năng này như các bản sửa lỗi cho các lỗi nhưng tôi 'muốn biết:

  • mục đích của chức năng này là,
  • lý do tại sao tôi cần phải xác định bản thân mình và
  • lý do tại sao nó có thể chấp nhận mã nó như là một vòng lặp vô hạn?
+2

Bạn có thể gặp lỗi này khi sử dụng lệnh 'gcc' nơi bạn nên sử dụng' g ++ '; Tôi đã thực hiện nó ít nhất một lần :) – user2023370

Trả lời

32

Nếu bất kỳ nơi nào trong chương trình của bạn một đối tượng được tạo bằng con trỏ hàm ảo không được điền và khi hàm tương ứng được gọi, bạn sẽ gọi là 'hàm ảo thuần túy'.

Trình xử lý bạn mô tả phải được xác định trong thư viện mặc định đi kèm với môi trường phát triển của bạn. Nếu bạn tình cờ bỏ qua các thư viện mặc định, bạn sẽ thấy trình xử lý này không được xác định: trình liên kết thấy một khai báo, nhưng không có định nghĩa. Đó là khi bạn cần cung cấp phiên bản của riêng bạn.

Vòng lặp vô hạn có thể chấp nhận được vì đó là lỗi 'lớn': người dùng phần mềm của bạn sẽ ngay lập tức nhận thấy. Bất kỳ việc thực hiện 'to' nào khác cũng được chấp nhận.

+0

Điều gì có thể khiến con trỏ hàm ảo không được điền vào? Trình biên dịch có phát hiện ra điều này và ngăn không cho biên dịch không? –

+2

:) hãy xem xét các câu hỏi 'có liên quan' ở bên phải. – xtofl

+0

@xtofl Cảm ơn, http://stackoverflow.com/questions/99552/where-do-pure-virtual-function-call-crashes-come-from đặc biệt hữu ích. –

15

1) Mục đích của hàm __cxa_pure_virtual() là gì?

Chức năng ảo thuần túy có thể được gọi trong khi xây dựng/hủy đối tượng. Nếu điều đó xảy ra, __cxa_pure_virtual() sẽ được gọi để báo cáo lỗi. Xem Where do "pure virtual function call" crashes come from?

2) Tại sao bạn có thể cần tự xác định?

Thông thường, chức năng này được cung cấp bởi libstdC++ (ví dụ: trên Linux), nhưng avr-gcc và chuỗi công cụ Arduino không cung cấp libstdC++.

Arduino IDE quản lý để tránh lỗi trình liên kết khi xây dựng một số chương trình bởi vì nó biên dịch với các tùy chọn "-ffunction-sections -fdata-sections" và liên kết với "-Wl, - gc-sections". tham chiếu đến các biểu tượng không sử dụng.

3) Tại sao có thể chấp nhận mã __cxa_pure_virtual() dưới dạng vòng lặp vô hạn?

Vâng, điều này ít nhất là an toàn; nó có thể dự đoán được. Sẽ hữu ích hơn nếu hủy bỏ chương trình và báo cáo lỗi. Một vòng lặp vô hạn sẽ là khó xử để gỡ lỗi, mặc dù, trừ khi bạn có một trình gỡ lỗi có thể làm gián đoạn thực hiện và cung cấp cho một backtrace ngăn xếp.

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