2009-07-20 74 views
9

Tôi mới sử dụng c và tôi có một số mã được cung cấp một số mã nguồn mà người khác đã viết được biên dịch trên cửa sổ.biên dịch trên windows và linux

Sau khi cố gắng thực hiện biên dịch trên linux, tôi có lỗi vì linux không hỗ trợ DWORD, WORD và AND UINT32. Tôi có 6 tập tin ví dụ. A.h, A.c, B.h, B.c, C.h, C.c. Các từ khóa này nằm trong tất cả các tệp.

Vì vậy, tôi đang nghĩ đến 2 giải pháp khả thi. Tốt hơn là #define hoặc typedef.

1)

typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 

2)

#define DWORD unsigned long 
#define WORD unsigned short 
#define UINT32 unsigned int 

Đối với phần thứ hai tôi tự hỏi nơi tôi nên đặt những tờ khai. Họ có nên đi trong các tập tin tiêu đề, hoặc họ nên đi trong các tập tin nguồn?

Ví dụ: tôi có nên làm điều gì đó như thế này trong tệp tiêu đề hoặc trong tệp nguồn không?

#ifdef WIN32 
/* windows stuff */ 
#else 
typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 
#endif 

Rất cám ơn những lời đề nghị trên,

Trả lời

13

Bạn đã tìm thấy các giải pháp cho mình:

#ifdef WIN32 
/* windows stuff */ 
#else 
typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 
#endif 

Đặt điều này trong một file riêng (typedefs.h) và bao gồm nó từ khắp mọi nơi. Typedef luôn được ưu tiên hơn các macro tiền xử lý.

Đề xuất của tôi: Không sử dụng DWORD, WORD hoặc các loại Win32 khác. Tôi thường thích sử dụng các loại chuẩn C99: uint_t, int_t hoặc uint16_t, uint32_t

+0

Đánh bại tôi với nó .. thats những gì tôi nhận được cho gõ chậm –

+0

Nếu bạn đang đi để duy trì nền tảng compilability, bạn có thể muốn chỉ cần đặt nó trong một tập tin có tên windows.h mà bạn giữ ở một vị trí tiêu chuẩn, vì đó là tệp trên các cửa sổ giúp bạn nhận được các khai báo đó. –

+0

nếu máy có dài = 8 (64 bit máy), sử dụng typedef unsigned int DWORD. – Antarus

4

Kiểu chữ chắc chắn đẹp hơn. #defines là tiền xử lý của macro và có thể có hậu quả ngoài ý muốn, bởi vì về cơ bản, bộ tiền xử lý C thực hiện tìm kiếm và thay thế toàn cục cho các định nghĩa. Typedefs là hướng dẫn cho trình biên dịch, và phù hợp hơn với những gì bạn muốn làm.

2

typedef sẽ tốt hơn trong trường hợp này vì #define chỉ là một cơ chế chung nhưng typedef là để xác định các loại đó là những gì bạn đang làm.

tôi sẽ nói đặt mã của bạn:

#ifdef WIN32 
/* windows stuff */ 
#else 
typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 
#endif 

vào một tập tin tiêu đề mới (với lính gáC#define/# pragma một lần), sau đó bao gồm mà từ tiêu đề hoặc nguồn file khi cần thiết.

1

Sử dụng typedef biến kết quả thành một loại thực tế được đưa vào cây cú pháp. (Nói cách khác, các trình biên dịch biết về nó và nhận ra nó như là một phần của ngôn ngữ.)

#define, ngược lại, chỉ là một thay thế văn bản. Vì vậy, trình biên dịch không bao giờ được biết về nó, nó thay vì chỉ nhìn thấy bất cứ điều gì nó được thay thế. Điều này có thể làm cho việc tìm kiếm các lỗi biên dịch trở nên khó khăn hơn.

Đối với trường hợp của bạn, tôi có thể khuyên bạn nên typedef. #define có địa điểm, nhưng tôi không thể thấy bất kỳ lý do nào khiến bạn không muốn sử dụng typedef tại đây.

Xin lưu ý rằng các thư viện khác có thể đã xác định các loại này, vì vậy bạn có thể có xung đột.Nếu bạn thực sự muốn có nền tảng đa nền tảng, bạn có thể nghĩ đến việc xác định các loại với không gian tên của ứng dụng của bạn bằng cách nào đó. Giống như

myapp_dword 
myapp_word 

để giảm thiểu va chạm với các thư viện khác.

Cuối cùng, tôi thực sự khuyên bạn nên chống lại toàn bộ cách tiếp cận bạn đang thực hiện. Nếu có thể, tốt nhất là chỉ sử dụng các tên tập tin được xác định trong ngôn ngữ và trong thư viện chuẩn C (như size_t, vv) Mã của bạn sẽ di động hơn và bạn sẽ ít đau đầu hơn.

+0

Xin chào. Khi bạn nói tên tệp được xác định bằng ngôn ngữ và trong thư viện chuẩn C. Tôi có nên thay đổi tất cả các DWORD, WORD, và UINT32 này thành unsigned dài, unsigned ngắn và unsigned int. Thay vì sử dụng DWORD, WORD, vv Có phải vì những loại đó sẽ hoạt động trên cả hai cửa sổ và linux? Cảm ơn nhiều. – ant2009

+0

Có, nói chung đó là những gì tôi đang nói. Tuy nhiên, thư viện C chuẩn C ALNG định nghĩa các kiểu có các bảo đảm cụ thể về phạm vi. size_t là một ví dụ tốt về kiểu như vậy. – Christopher

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