2009-10-27 41 views
9

Okay,Phương thức nội tuyến tĩnh?

Dưới đây là những gì tôi đang cố gắng để làm ... Ngay bây giờ nó được biên soạn nhưng thất bại tại liên kết ... LNK2001

Tôi muốn các phương pháp tĩnh vì không có biến thành viên, tuy nhiên Tôi cũng muốn họ nội tuyến cho các speedups họ cung cấp.

Cách tốt nhất để làm điều này là gì? Đây là những gì tôi có trong Tóm lại:

/* foo.h */ 
class foo 
{ 
    static void bar(float* in); 
}; 

/* foo.cpp */ 
inline void foo::bar(float* in) 
{ 
    // some dark magic here 
} 

Tôi đang cố gắng để làm điều này vì tôi muốn để có thể đi:

foo::bar(myFloatPtr); 

foo không có bất kỳ biến thành viên ... nó không có ý nghĩa.

+0

Ngoài ra, từ quan điểm thiết kế, có thể sử dụng tham chiếu đến phao thay vì con trỏ không? Tham chiếu thường được ưu tiên. – GManNickG

+0

vâng, tôi biết ... nhưng trong trường hợp này tôi không thể có được xung quanh năng động :) – Polaris878

+0

++ 1 Đối với "ma thuật tối ở đây". – nahpr

Trả lời

10

Nếu bạn đang gọi thanh từ một tệp cpp khác, ngoài foo.cpp, nó cần phải nằm trong tệp tiêu đề.

+1

grrrr có ý nghĩa – Polaris878

3

Bạn phải xác định hàm nội dòng của mình trong tệp tiêu đề chứ không phải tệp triển khai riêng biệt. Các định nghĩa là cần thiết khi các tập tin tiêu đề là # bao gồm, nếu họ hy vọng sẽ được inlined, sau khi tất cả.

Lỗi liên kết bạn đang thấy là do khai báo (trong tệp tiêu đề) không thông báo cho trình biên dịch rằng phương thức là nội tuyến, trong khi việc thực hiện là nội dòng, do đó không có sẵn để liên kết.

5

Đầu tiên, tôi sẽ đặt chúng vào một số namespace thay vào đó, vì không có logic nào cả trong số đó "class". Thứ hai, bạn có thể định nghĩa thân hàm trong tệp tiêu đề trực tiếp để cho phép trình biên dịch xem chúng. Nếu không, bạn cần whole program optimization được thực hiện bởi trình liên kết để nội tuyến hóa các hàm đó (AFAIK).

+0

Vâng, bạn có thể đúng về không gian tên ... Tôi đã có chúng trong các lớp học bởi vì tất cả chúng đều có chức năng tương tự – Polaris878

1

Nói chung các chức năng nội tuyến có thể được thực hiện khi chúng được khai báo (trong tệp tiêu đề). Trình biên dịch là miễn phí đối với các hàm nội tuyến khi bạn có chúng, nhưng bạn không thể buộc nó vào nội tuyến bất kỳ thứ gì. Nếu bạn đang sử dụng Visual C++, hãy bật "nội tuyến phù hợp", "tạo mã thời gian liên kết" và "mã nhanh ưu tiên".

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