2010-08-29 27 views
5

Tôi đang xem xét mã của phiên bản Unix 6 với cuốn sách của Sư tử. Một trong những tập tin tiêu đề (param.h, có thể được truy cập here) định nghĩa các cấu trúc sau:Cấu trúc dường như xác định không có trường hợp nào trong Unix v6

/*struct to access integers*/ 

/*single integer */ 
struct { int integ; }; 

/*in bytes*/ 
struct { char lobyte; char hibyte; }; 

Những cấu trúc này dường như không xác định bất kỳ trường hợp, cũng không phải là họ đặt tên như vậy họ có thể được sử dụng sau. Có ai biết sử dụng của họ không?

Cảm ơn

+0

Bạn có mã nguồn đầy đủ? Bạn có thể grep nó để xem nếu những điều đó đã từng được sử dụng? (Có thể là một chút khó khăn để grep, nhưng bạn có thể cố gắng tìm các tập tin bao gồm tiêu đề đó và sau đó sử dụng một cái gì đó gọi là "lobyte", hoặc một cái gì đó ...) –

Trả lời

5

Nếu ai đó bao gồm cả tập tin trong một union, nó sẽ cho phép họ truy cập vào các phần khác nhau.

Nó sẽ là một cái gì đó như:


    union{ 
    #include <param.h> 
    } myparam; 

    myparam.integ = 0xDEAD; 
    assert(myparam.lobyte == 0xAD) 
    assert(myparam.hibyte == 0xDE) 

(Phụ thuộc vào endianness của kiến ​​trúc ...)

Vì vậy, sau khi nhìn xung quanh một chút, có vẻ như trong các phiên bản cũ của C, bạn sẽ không' t cần phải khai báo công đoàn; chỉ có một không gian tên cho tất cả các thành viên cấu trúc/công đoàn vừa dịch thành một bù đắp byte mà bạn có thể sử dụng trên bất kỳ biến nào. Các đề cập tốt nhất của điều này tôi có thể tìm thấy ở đây: http://docs.sun.com/source/806-3567/compat.html Mô tả trước ISO ISO C:

Cho phép cấu trúc, công đoàn và các loại số học sử dụng toán tử lựa chọn thành viên ('.', '->') để làm việc trên các thành viên các cấu trúc hoặc công đoàn khác.

+0

Là nó chỉ cho tôi hoặc là một cách cực kỳ phức tạp của làm nó? Tôi nghi ngờ đây là ý nghĩa của nó. Tôi khen bạn vì đã tìm cách để thực sự làm cho mã làm điều gì đó hữu ích. –

+0

Tôi phải thừa nhận, tôi không chắc chắn. Tôi đã thấy một số thủ thuật/struct/include khủng khiếp trong mã C cũ. Nó không có vẻ kỳ lạ khi bạn đến từ hội đồng - cấu trúc và công đoàn thường được coi là một mô tả về bố trí bộ nhớ, chứ không phải là một tuyên bố loại. – rjw

+0

nó dường như được sử dụng như thể nó là một công đoàn nhưng không tuyên bố cụ thể nó. Vì vậy, ví dụ, nếu có một số nguyên, bạn sẽ thấy những thứ như myint.lobyte. param.h không bao gồm rất nhiều hằng số khác có nghĩa là bao gồm nó trong một công đoàn có thể sẽ không hoạt động.Nó có thể có một cái gì đó làm với C cổ đại – theprole

1

Quay lại những ngày đó, các thành viên của các cấu trúc đều chia sẻ cùng một không gian tên, không phải một không gian tên trên mỗi cấu trúc. Do đó, mỗi phần tử của một cấu trúc phải có một tên duy nhất trên tất cả các cấu trúc, hoặc cùng một phần tử phải xuất hiện cùng loại ở cùng một độ lệch trong mọi cấu trúc mà nó xuất hiện. Khá được sử dụng như thế nào, tôi không chắc chắn, nhưng tôi nghi ngờ bạn có thể làm:

int x; 

x.lobyte = 1; 
x.hibyte = 2; 

Hoặc tương tự như vậy.

Xem thêm:

(Cả những dường như để trả lời câu hỏi này, mặc dù.)

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