2009-09-14 26 views
13

Tại sao tôi nhận được cảnh báo này trong Trình tạo Qt: 'hàm nội tuyến' bool Lion :: growl() 'được sử dụng nhưng chưa bao giờ được xác định?Qt Creator: “chức năng nội tuyến được sử dụng nhưng không bao giờ được xác định” - tại sao?

tôi kiểm tra lại mã của tôi, và có một tuyên bố

inline bool growl() trong Lion (lion.h)

và thực hiện tương ứng trong lion.cpp:

inline bool Lion::growl()

gì đang xảy ra?

EDIT: Giả định của tôi là xác định phương thức nội tuyến thực tế trong tệp .cpp (từ khóa inline cảnh báo trình biên dịch tìm cơ thể phương pháp ở nơi khác) hoặc tôi nhầm?

Tôi không muốn làm lộn xộn các tệp tiêu đề của mình với chi tiết triển khai.

+0

lưu ý phụ: Tôi đã học được rằng các hàm nội tuyến được triển khai trong tệp tiêu đề (hoặc trong một tệp inl riêng biệt được bao gồm ở cuối tiêu đề). – RvdK

Trả lời

26

Vâng, tôi không biết vấn đề chính xác, nhưng đối với người mới bắt đầu: phương pháp

  • Inline có nghĩa vụ phải được thực hiện trong các tập tin tiêu đề. Trình biên dịch cần phải biết mã thực tế là nội tuyến nó.
  • Cũng sử dụng từ khóa "nội tuyến" trong tuyên bố lớp học không có bất kỳ ảnh hưởng nào. Nhưng nó cũng không thể làm hại được.

Xem thêm: c++ faq lite

+3

Cá nhân (và đây là vấn đề về hương vị), tôi * ghét * mã đánh dấu rõ ràng mã nội tuyến - bằng từ khóa nội tuyến hoặc bằng cách đặt triển khai trong tệp tiêu đề vì 2 lý do: 1) nó ngắt đóng gói. 2) nó đau hiệu suất - có, bạn nghe tôi. Bạn nghĩ ai biết được liệu nội tuyến toán học có mang lại hiệu suất tốt nhất hay không: trình biên dịch hoặc lập trình viên. Nghiêm túc mọi người, tin tưởng người tối ưu của bạn, họ làm một công việc tốt hơn (trong nhiều trường hợp, nhưng không phải tất cả) sau đó bạn sẽ bao giờ. – Thomi

+7

@Thomi nếu tôi chỉ tạo ra một wrapper 1 dòng xung quanh một hàm, tôi khá chắc chắn nó là tốt hơn cho nó để được inlined. –

+0

Microsoft đang nói rằng họ có thể tăng hiệu suất lớn trong thời gian liên kết và giảm kích thước trong libs tĩnh bằng cách thực thi quy tắc này: http://blogs.msdn.com/b/vcblog/archive/2014/09/26/feedback- make-zc-inline-default-for-debug-release-configs-in-14.aspx – bames53

1

Ngoài những gì Johan nói, bạn không thể có một định nghĩa riêng biệt và khai cho chức năng ngay cả khi cả hai đều trong file header tương tự. Điều này đúng đối với các chức năng thành viên của các lớp. Mã chức năng nên có dạng:

class someClass 
{ 
void someFunc() 
{ ... } 
} 
// This will make the function inline even w/o the explicit 'inline' 

Và KHÔNG có dạng

class someClass 
{ 
public: 
    void someFunc(); 
} 

void someClass::someFunc() 
{ ... } 
+0

Bạn thực sự có thể có một định nghĩa và khai báo riêng biệt: 'class C {inline void f(); }; void C :: f() {} '. Bạn chỉ cần sử dụng 'inline' rõ ràng hơn là ngầm định. – bames53

3

phương pháp Inline có nghĩa vụ phải được thực hiện trong các tập tin tiêu đề. Trình biên dịch cần biết mã để thực sự mã hóa nó.

Trừ nếu hàm inline được sử dụng trong cùng một dự án, có thể trong tập tin khác mà #include tiêu đề của nó.

Tôi nhớ có hạn chế như vậy đối với các thư viện vì hạn chế tiêu đề để hoạt động nguyên mẫu giúp mọi thứ dễ đọc hơn.

Còn khoảng #include -ing the .cpp?

+0

C++ yêu cầu "Hàm nội tuyến phải được xác định trong mọi đơn vị dịch mà không được sử dụng." _n3337 basic.def.odr/3_ Điều đó về cơ bản có nghĩa là khi một hàm nội tuyến được khai báo trong một tiêu đề, nó cũng phải được định nghĩa trong phần đầu trang. – bames53

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