2014-04-24 23 views
6

Tôi muốn viết thư viện C++ là không chỉ tiêu đề theo mặc định nhưng có thể được sử dụng làm thư viện chỉ tiêu đề xác định macro NOLIB.Thư viện chỉ tiêu đề tùy chọn

Tôi đã nhìn thấy hai phương pháp:

  • định nghĩa inline

foo.h

#if !defined(FOO_H) 
#define  FOO_H 

#if defined(NOLIB) 
# define MYINLINE inline 
#else 
# define MYINLINE 
#endif 

class foo 
{ 
    // ... 
}; 

#if defined(NOLIB) 
# include "foo.cc" 
#endif 

#endif // include guard 

foo.cc

#if !defined(NOLIB) 
# include "foo.h" 
#endif 

MYINLINE void foo::something() { ... } 

  • "nhân tạo" mẫu

foo.h

#if !defined(FOO_H) 
#define  FOO_H 

#if defined(NOLIB) 
# define MYTEMPLATE template<bool DUMMY> 
# define MYFOO  foo_impl 
# define MYFOO_T foo_impl<DUMMY> 
#else 
# define MYTEMPLATE 
# define MYFOO  foo 
# define MYFOO_T foo 
#endif 

MYTEMPLATE 
class MYFOO 
{ 
    // ... 
}; 

#if defined(NOLIB) 
    using foo = foo_impl<true>; 
# include "foo.cc" 
#endif 

#endif // include guard 

foo.cc

#if !defined(NOLIB) 
# include "foo.h" 
#endif 

MYTEMPLATE 
void MYFOO_T::something() { ... } 

Ưu và nhược điểm của các phương pháp này là gì? Có lựa chọn nào tốt hơn không?

+0

Nếu các chức năng đủ nhỏ để được gạch chân, bạn có khả năng gửi các bản triển khai trong một thư viện tĩnh hoặc thậm chí gửi các tệp .cc. –

Trả lời

2

Không có sự khác biệt thực sự trong mỗi phương pháp vì cả hai phương thức nội tuyến hoặc mẫu có thể được chèn vào nội tuyến với mã của bạn tùy thuộc vào tối ưu hóa trình biên dịch. Xem bài viết this thảo luận về nội tuyến so với mẫu.

+0

Tôi không quá lo lắng về mã bloat một lý do là phiên bản chỉ tiêu đề sẽ dành cho người dùng thông thường. Tôi đã suy nghĩ về các vấn đề như phụ thuộc vòng tròn hoặc các vấn đề không lường trước khác có thể xuất hiện cố gắng chuyển đổi một thư viện chuẩn. Ngoài ra các mẫu nhân tạo có vẻ như một căng của ngôn ngữ C + +. – manlio

+1

Tôi nghĩ điều quan trọng cần quan tâm trong cả hai trường hợp là tránh sử dụng dòng không gian tên trong mã của bạn mà có thể gây ra vấn đề cho người dùng cuối, vì vậy bạn nên triển khai mọi thứ trong không gian tên (nếu bạn đang kiện chúng). Bạn có thể có phụ thuộc vòng tròn trong một trong các trường hợp bạn đã đề cập. – bossbarber

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