2016-03-14 12 views
10

Trong C: The Complete Reference, Herbert Schildt nói rằngTiêu đề có thể tồn tại mà không phải là tệp không?

Headers thường tác phẩm, nhưng họ không nhất thiết phải tập tin. Nó được phép cho một trình biên dịch để xác định trước nội dung của một tiêu đề nội bộ. Tuy nhiên đối với tất cả các mục đích thực tế, tiêu đề c tiêu chuẩn được chứa trong các tệp tương ứng với tên của chúng.

Làm cách nào để tiêu đề tồn tại mà không phải là tệp? Chủ đề của đoạn văn này là gì? Vì phần mở rộng tệp .h được sử dụng với tiêu đề.

+2

Ví dụ: bạn có thể nói '#include"/path/to/some/named/pipe "'. Tất nhiên, bạn sẽ mong đợi rằng đường ống được đặt tên luôn tồn tại cho mọi đơn vị biên dịch, nhưng đảm bảo rằng có thể khó hơn giá trị của nó (hãy nhớ rằng đơn vị biên dịch đầu tiên "lấy" đường ống được đặt tên có thể đóng ống đó cho các đơn vị biên dịch sau này) – inetknght

+3

Bạn có thể thêm một chút ngữ cảnh xung quanh báo giá không? – edmz

+0

Tôi cho rằng nhận xét của tôi liên quan đến '# include' hơn là các tiêu đề cụ thể. Bạn muốn ngữ cảnh nào hơn? – inetknght

Trả lời

6

Tiêu chuẩn C không tạo sự khác biệt giữa tiêu đề và nguồn file được gọi bằng #include chỉ thị tiền xử lý:

6.10.2 Nguồn tập tin bao gồm

chế

1 Một chỉ #include sẽ xác định tệp tiêu đề hoặc tệp nguồn có thể được xử lý bằng cách triển khai.

Semantics

2 Một chỉ thị tiền xử lý của mẫu

# include <h-char-sequence> new-line 

tìm kiếm một chuỗi các nơi thực hiện xác định cho một tiêu đề xác định duy nhất bởi trình tự quy định giữa các < và> delimiters, và gây ra thay thế chỉ thị đó bằng toàn bộ nội dung của tiêu đề. Cách xác định các địa điểm hoặc tiêu đề được xác định là được thực hiện.

3 Một chỉ thị tiền xử lý của mẫu

# include "q-char-sequence" new-line 

gây ra thay thế chỉ thị rằng toàn bộ nội dung của tập tin nguồn được xác định theo trình tự quy định giữa các "dấu phân cách. Các tập tin nguồn được đặt tên được tìm kiếm trong một cách thực hiện xác định. Nếu tìm kiếm này không được hỗ trợ, hoặc nếu tìm kiếm thất bại, chỉ thị được tái chế như thể nó đọc

# include <h-char-sequence> new-line 

với chuỗi chứa giống hệt nhau (bao gồm cả> ký tự, nếu có) từ hoặc chỉ thị iginal.

Trình biên dịch có thể triển khai sơ đồ nơi tiêu đề chuẩn không thực sự được lưu trữ dưới dạng tệp trong hệ thống tệp. Nhưng chỉ thị #include "filename.h" được quy định như tìm kiếm đầu tiên cho một tập tin theo một cách cụ thể hệ thống, và sau đó tìm kiếm tiêu đề tiêu chuẩn, nếu như chỉ thị đã #include <filename.h>

Lưu ý rằng các phần mở rộng tên tập tin .c.h là thuần túy một quy ước để phân biệt các file chứa các khai báo và các tệp có chứa các định nghĩa mã và dữ liệu thực tế. Không có gì trong tiêu chuẩn làm cho quy ước này là một yêu cầu, ngoài các tên được sử dụng cho các tiêu đề chuẩn. Một số người sử dụng các công ước khác với các phần mở rộng khác nhau hoặc không có phần mở rộng ở tất cả cho các nhu cầu cụ thể, nhưng phần lớn các lập trình viên C sẽ coi đây là thực hành không tốt.

Shafik Yaghmour cung cấp báo giá từ C99 Lý do trong một câu trả lời cho một câu hỏi tương tự mà móng tay các ủy ban ý định về vấn đề này: https://stackoverflow.com/a/27262904/4593267

4

Tiêu chuẩn C một cách rõ ràng nói rằng một tiêu đề là một tập tin, vì vậy tôi nghĩ không .

6.10.2 file nguồn bao gồm

Một chỉ #include phải xác định một tiêu đề hoặc nguồn tập tin có thể được xử lý bởi thực hiện.

Tuy nhiên, những gì được tính là tệp cho hệ thống nhất định được xác định thực hiện. Nó có thể trong lý thuyết là một cổng phần cứng, một đường ống hoặc một số silliness khác. Hầu hết các hệ điều hành chính có khả năng xử lý các cổng hoặc đường ống dưới dạng tệp (ví dụ trong Windows, tệp và cổng phần cứng được mở bằng cùng chức năng.)

+3

Trong phần 7.1.2 "Tiêu đề chuẩn", tiêu chuẩn có chú thích 'Tiêu đề không nhất thiết phải là tệp nguồn, cũng không phải là chuỗi < and > phân tách trong tên tiêu đề nhất thiết phải là tên tệp nguồn hợp lệ.', do đó tệp chỉ đề cập đến" nguồn tập tin ", không phải để tiêu đề –

+0

@zauguin Có? Ghi chú chân không phải là tiêu chuẩn trong tiêu chuẩn ISO. – Lundin

0

Trình biên dịch C giả thiết không cần hệ thống tệp. Nó có thể xử lý một chỉ thị #include khác:

  • nó có thể truy vấn một cơ sở dữ liệu (IIRC một số trình biên dịch của IBM đã làm điều đó vào những năm 1980, các cơ sở dữ liệu chứa một bộ nhớ cache của AST)

  • nó có thể xử lý tiêu chuẩn bao gồm nếu không, đó là khi nó gặp #include <stdio.h> trong một số điều kiện nhất định - thay đổi trạng thái bên trong của nó (theo tiêu chuẩn yêu cầu) mà không cần truy cập bất kỳ tiêu đề nào tệp. Nói cách khác, tiêu đề chuẩn có thể là "nội trang".

Trong thực tế, tất cả trình biên dịch C tôi biết hiện nay đang sử dụng hệ thống tệp cho tiêu đề. Nhưng hãy đọc về precompiled headers in GCC.

BTW, đề cập đến "tệp tiêu đề" trong đặc điểm kỹ thuật C11 n1570 không yêu cầu hệ thống tệp (như trong hệ điều hành thông thường).

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