2010-04-19 11 views
13

Tôi có một typedefTrong C++, làm thế nào tôi có thể làm cho typedef hiển thị cho mọi tệp trong dự án của tôi?

typedef unsigned int my_type; 

được sử dụng trong tệp. Tôi muốn làm cho nó hiển thị trên tất cả các tệp của tôi, mà không cần đặt nó vào tệp tiêu đề được bao gồm bởi mọi thứ. Tôi không muốn đi tiêu đề tập tin tuyến đường bởi vì vì nó đứng này sẽ là tuyên bố duy nhất trong tập tin tiêu đề (và có vẻ như không cần thiết để thêm một tập tin chỉ cho việc này).

Có cách nào để thực hiện việc này không?

Nếu thay vào đó tôi có:

typedef X my_type; 

trong đó X là một lớp học, tôi sẽ cần phải bao gồm X.h ở khắp mọi nơi và có typedef vào cuối của X.h?

Trả lời

17

Tôi không muốn đi đường dẫn tệp tiêu đề vì vì nó đứng này sẽ là khai báo duy nhất trong tệp tiêu đề (và có vẻ như không cần thiết để thêm tệp chỉ cho việc này).
Có vấn đề gì với điều đó? Có vẻ như không cần thiết để tránh tạo một tệp bằng mọi giá.

Có cách nào để thực hiện việc này không?
Không xa như tôi biết.

tôi có cần phải bao gồm X.h ở mọi nơi và có kiểu chữ vào cuối X.h không?
Không, nhưng đó có lẽ là điều tốt nhất. Lý do duy nhất bạn nên làm đó là nếu X là một mẫu, và bạn cần mẫu để được trong tiêu đề anyway.

+0

một lý do khác sẽ là X là tuyên bố chuyển tiếp. – peterchen

+0

@peterchen: Sau đó, X không nên gõ, bạn nên sử dụng tên của lớp, X. –

+0

: nhún vai: Có rất ít lý do để gõ một tên lớp "tinh khiết" anyway - nhưng hey, nó đã không được ý kiến ​​của tôi! – peterchen

9

Không có cách nào xung quanh điều này đến mức tôi có thể thấy. Tại sao bạn không làm cho một tập tin tiêu đề globals.h chỉ với các tờ khai bạn muốn ở khắp mọi nơi và bao gồm?

Đừng bị cám dỗ khi chôn vùi typedef của bạn ở đâu đó và hy vọng rằng 'vì mọi thứ khác bị tắt khỏi tiêu đề' sẽ tốt hơn khi thêm tiêu đề toàn cầu - thực tế là không có tiêu đề khép kín.

Ngoài ra, để ngăn chặn cluttering lên không gian tên toàn cầu tạo của riêng bạn:

namespace MyTypes 
{ 
    typedef A B; 
    const unsigned int g_nMyGlobalType = 10; 
    // etc. 
} 

Bằng cách đó bạn có thể sử dụng globals của bạn một cách gọn gàng đẹp:

MyTypes::B myVar; // etc 
+1

Giải pháp tiêu đề toàn cầu không phải là rất đẹp (từ quan điểm phụ thuộc), đặc biệt tôi khuyên bạn KHÔNG nên sử dụng nó làm tiêu đề mặc định;) –

1

Tôi sẽ sử dụng các tập tin tiêu đề lộ trình, nó không quá tệ.

Không, bạn sẽ không cần bao gồm X.h ở mọi nơi, chỉ ở những nơi bạn sử dụng typedef.

0

Không, không có cách nào để có được xung quanh cần phải có typedef trong một tập tin tiêu đề được bao gồm ở khắp mọi nơi bạn cần nó, nhưng không, bạn không nhất thiết cần phải bao gồm các tập tin X.h trong trường hợp thứ hai.

Nếu bạn có

typedef X my_type; 

X là một lớp học, bạn có thể làm điều này (trong một tiêu đề khác hơn X.h):

class X; 
typedef X my_type; 

nào về phía trước-tuyên bố X, và sau đó tạo ra một nhập bí danh cho nó. Sau đó, có X.h bao gồm tệp này.

Sau đó, nếu bạn chỉ cần typename không đầy đủ my_type, bạn có thể bao gồm các tập tin tiêu đề typedef rất ngắn, và bạn chỉ cần bao gồm X.h khi bạn sẽ phải cần đến một định nghĩa hoàn chỉnh cho lớp X anyway.

0

Tuyên bố điều gì đó (ví dụ: một lớp, typedef, hàm) trong một đơn vị dịch (ví dụ: tệp cpp) thực sự là một cách tiêu chuẩn nói "điều này chỉ được sử dụng trong tệp này", bởi vì không thể tham khảo nó từ các tập tin khác. Các đơn vị dịch thuật không có ý tưởng về sự tồn tại của nhau, khác với các khai báo (ví dụ: nguyên mẫu) được chia sẻ bởi các tệp .h - không nói gì về việc triển khai. Đó là trình liên kết đưa tất cả các triển khai và dán chúng lại với nhau thành một tệp nhị phân.

Nếu bạn muốn nó hiển thị bên ngoài tệp - hãy đặt nó vào tệp .h và bao gồm nó. Như các câu trả lời khác đã đề xuất, một tệp .h chung hoặc toàn cầu có thể hữu ích. Một số trình biên dịch sử dụng các tiêu đề được biên dịch sẵn làm cho việc này trở nên dễ dàng - đặt nó vào phần đầu được biên dịch trước.

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