2011-07-19 46 views
7

Tôi có một vài bản sao, chúng ta hãy nói, stddef.h trên hệ thống của tôi, một là trong đường dẫn /usr/include/linux/stddef.h, và trông như thế này:Tại sao các tiêu đề khác nhau có cùng tên?

#ifndef _LINUX_STDDEF_H 
#define _LINUX_STDDEF_H 

#undef NULL 
#if defined(__cplusplus) 
#define NULL 0 
#else 
#define NULL ((void *)0) 
#endif 

#endif 

Một số khác là trong đường dẫn /usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/include/, và đó là một trong đó là được sử dụng khi tôi nói #include <stddef.h>. Nội dung của một người rất khác với nội dung đầu tiên, chứa các định nghĩa của ptrdiff_t, size_t, v.v.

Câu hỏi của tôi là: Cần đặt định nghĩa size_tstddef.h, tuy nhiên người đầu tiên không tuân theo điều đó. Đó rõ ràng không phải là một trong những tiêu chuẩn được đề cập trong tiêu chuẩn C/C++. Nếu tệp đó có sẵn cho một số mục đích khác, thì tại sao cả hai tệp này có tên là stddef.h, sẽ không an toàn hơn nếu chúng có tên khác?

+0

Điều đó trông khá cá, và từ bảo vệ đủ điều kiện dường như ngụ ý rằng nó không cố ý giả mạo như stddef.h. Bạn có thể kiểm tra xem nó đến từ đâu không? – Cheezmeister

+0

@Cheezmeister: 'apt-file' sản lượng: ' linux-libc-dev:/usr/include/linux/stddef.h' và 'gcc-4.5:/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/include/stddef.h' – loudandclear

+0

@Cheezmeister. Tôi thứ hai bạn. Không có tên đường dẫn '/ usr/include/linux/stddef.h' ngụ ý đó là tiêu đề ** tiêu chuẩn **. Không có 'stddef.h' trong'/usr/include' trong bản sao Linux của tôi (Slackware64 13). – shinkou

Trả lời

3

Các hạt nhân Linux không liên kết với thư viện chuẩn c, do đó, như là một quy tắc chung - tiêu chuẩn bao gồm các tệp không thể được sử dụng một cách an toàn, vì vậy hạt nhân Linux sử dụng các tệp bao gồm riêng của nó, được biết là không dựa vào các hàm hoặc dữ liệu thư viện c.

Bất kỳ phần mềm nào để chạy trong không gian hạt nhân - chẳng hạn như mô-đun hạt nhân - nên sử dụng tệp include/linux chứ không phải thư viện chuẩn.

Rõ ràng hạt nhân bao gồm các tệp chỉ bao gồm những thứ có khả năng cần thiết trong hạt nhân do đó là một tập con rất nhỏ của tiêu chuẩn c bao gồm các tệp.

0

Tiêu chuẩn C yêu cầu bao gồm stddef.h là đủ để xác định size_t. Dưới mui xe, nó có thể được đặt ra tuy nhiên những người thực hiện thư viện mong muốn.

Bạn sẽ thấy điều này rất nhiều trong Linux, chủ yếu là do nhiều triển khai khác nhau giữa các hệ thống (ví dụ x86 vs arm) và dễ nhất để đưa phiên bản cụ thể vào một thư mục riêng biệt.

Lưu ý: Tuy nhiên, trong trường hợp cụ thể là /usr/include/linux/stddef.h, đây là tiêu đề hạt nhân (có nghĩa là biên dịch hạt nhân). Điều này không có ý định được đưa vào trong mã nguồn của không gian người dùng.


này chỉnh sửa là để trả lời bình luận shinkou của. Tôi không biết cách thực hiện nhận xét nhiều dòng, vì vậy đây là cách dễ nhất:

$ cat incltest.c 
#include <stddef.h> 

$ cpp -H incltest.c 
... 
. /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/include/stddef.h 
... 

Bạn có thể thực hiện việc này cho bất kỳ tiêu đề nào.

Nói chung, nếu bạn có nhiều phiên bản của GCC trên hệ thống của bạn, bạn sẽ có nhiều phiên bản của cpp (và do đó bạn có thể thấy rằng các phiên bản khác nhau được sử dụng bởi các trình biên dịch khác nhau):

$ cpp-4.4 -H incltest.c 
. /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.4.5/include/stddef.h 
+0

Đó cũng là điều tôi hiểu. Tuy nhiên, bạn có thể giải thích tại sao '/ usr/include/stddef.h' không tồn tại (trong một số bản phân phối, ví dụ: Slackware) không? – shinkou

+0

Nếu phân phối cho phép nhiều bản phân phối libc (và, do đó, nhiều phiên bản của stddef.h), bạn sẽ triển khai nó như thế nào? Bạn có lẽ sẽ đặt nó trong các thư mục khác nhau. GCC giữ nó trong các thư mục riêng biệt, và trình biên dịch sẽ tự động thêm các tiêu đề phiên bản cụ thể trong một thư mục được xác định trước. - Chỉ cần kiểm tra, cpp-H sẽ cho bạn biết tiêu đề nào được sử dụng –

+0

Nếu '/ usr/include/linux/stddef.h' chỉ dành cho việc sử dụng trình biên dịch hạt nhân, chúng ta có thể tìm thấy * stddef.h * thật * 'cho không gian người dùng sau đó? 'find/usr/include -type f -name stddef.h' chỉ trả về'/usr/include/linux/stddef.h' trên máy tính của tôi. – shinkou

0

tôi nghĩ rằng một liên quan đến tiêu đề GCC standerd và một phần tử khác có liên quan đến định nghĩa hạt nhân cụ thể. Vì vậy, các nội dung khác nhau với cùng một mục đích trong phạm vi khác nhau.

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