2010-09-07 43 views
6

Tôi đang làm việc với mã C được nhúng kế thừa xác định các loại uint8_t, uint16_tuint32_t trong tệp tiêu đề bằng cách sử dụng từ khóa typedef.Thời gian kiểm tra biên dịch tồn tại của stdint.h

Để thảo luận, hãy cho chúng tôi biết tệp typedefs.h chứa các định nghĩa này.

Trong mô-đun nguồn C mới của tôi, tôi bao gồm stdint.h. Tôi cũng bao gồm các tệp tiêu đề khác bao gồm typedefs.h ở đâu đó trong cấu trúc phân cấp. Như dự kiến, trình biên dịch phàn nàn về nhiều biểu tượng được xác định.

Tôi muốn sửa đổi tệp cũ typedefs.h để nó chỉ khai báo các loại uint*_t nếu stdint.h không được bao gồm hoặc tốt hơn nếu loại uint*_t không được xác định.

Hiểu biết của tôi là không thể sử dụng #ifndeftypedef không phải là chỉ thị tiền xử lý.

Vậy làm cách nào để yêu cầu trình biên dịch không xác định uint*_t nếu chúng đã tồn tại (hoặc nếu đã bao gồm stdint.h)?

Lưu ý: điều này sẽ dễ dàng nếu tiêu chuẩn được xác định theo tiêu chuẩn C bao gồm định nghĩa bảo vệ cho tệp tiêu đề.

FWIW, tôi đang sử dụng trình biên dịch Green Hills, 4,24, cho bộ xử lý ARM9.

Trả lời

4

Chỉ cần sửa tiêu đề cũ để luôn bao gồm stdint.h để nhận các loại này, xóa các định nghĩa trùng lặp và cung cấp tệp thả xuống stdint.h cho các hệ thống bị hỏng.

7

Tôi tin rằng stdint.h cũng phải xác định macro cho các giới hạn của các loại mà nó xác định. Bạn sẽ có thể thử nghiệm cho những người sử dụng một #ifdef và muốn.

#ifndef UINT32_MAX 
    typdef ... uint32_t; 
    #define UINT32_MAX ... 
    ... 
#endif 

Chỉnh sửa: Được sử dụng ban đầu là UINT32_MIN, nhưng như Jens Gustedt đã phát hiện ra đây là kết hợp của ký/unsigned và min/max không xảy ra.

+1

Hm, 'UINT32_MIN' không tồn tại. 'UINT32_MAX' hoặc' INT32_MIN' –

+0

+1 cho ý tưởng thông minh. –

+0

@Jens: Hai điều sau đây dường như gợi ý rằng các định nghĩa như vậy được yêu cầu 1) http://www.opengroup.org/onlinepubs/000095399/basedefs/stdint.h.html 2) http://linux-documentation.com/ vi/man/man0p/stdint.h.html – torak

0

Nếu bạn đang sử dụng hệ thống UNIX, bạn nên sao lưu một bước và sử dụng gói cấu hình như autoconf (1) hoặc tự động (1). Nó được thiết kế để xử lý các vấn đề như thế này.

+0

Đây là một hệ thống nhúng không sử dụng Unix cũng như Linux, nhưng ThreadX. Ngoài ra, nó được mã hóa trước khi 'stdint.h' trở thành tiêu chuẩn. –

+0

@Thomas: Bạn có thể chạy trình biên dịch Green Hills trên một hệ điều hành khác ngoài ThreadX, chẳng hạn như Linux hoặc Windows, phải không? Rất ít trình biên dịch nhúng được tự lưu trữ. Điều đó nói rằng, autoconf/automake âm thanh như overkill cho tình huống này, và họ giải quyết một vấn đề khác nhau: "làm thế nào để làm cho mã của tôi biên dịch trên nhiều nền tảng cho dù họ có stdint.h hay không? – bk1e

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