2012-12-03 45 views
5

thể trùng lặp:
What is the difference between #include <filename> and #include “filename”?Tại sao #include "stdio.h" hoạt động?

Tại sao không trình biên dịch phàn nàn khi tôi viết như sau:

#include "stdio.h" 

nên không đó là

#include <stdio.h> 

thay vào đó, vì stdio.h thực sự được lưu trữ trong thư mục thư viện chứ không phải trong thư mục của đơn vị dịch? Tại sao nó hoạt động?

+1

'" ... "' trông cục bộ * đầu tiên *, rồi đến nơi khác. – BoBTFish

+1

không, nó thực sự phải là '#inlcude ' – 111111

+1

http://stackoverflow.com/questions/21593/what-is-the-difference-between-include-filename-and-include-filename – BoBTFish

Trả lời

8

Sự khác biệt giữa ""<> không nhiều. Cả hai tìm kiếm tiêu đề trong các vị trí được xác định thực hiện 1, 2. Sự khác biệt là nếu tìm kiếm đó không thành công cho "", tìm kiếm diễn ra như thể nó đang sử dụng <>. (§16.2)

Về cơ bản, điều này có nghĩa là nếu <> tìm tiêu đề có tên nhất định, "" sẽ không tìm thấy tiêu đề có cùng tên .


Những nơi thực hiện xác định không phải là giống nhau cho cả hai hình thức.

Không yêu cầu một trong các thư mục thư viện tìm kiếm này và thư mục tìm kiếm khác trong thư mục TU. Trình biên dịch được phép tìm kiếm toàn bộ hệ thống tập tin và thậm chí cả google cho nó nếu nó muốn.

Điều này không có nghĩa là chúng luôn luôn tìm cùng một tiêu đề.

+0

Có một yêu cầu, mặc dù, nếu '#include" xxx "' không thành công, trình biên dịch sẽ xử lý lại nó như thể nó đã là '#include '. –

+0

@ James Đó là những gì tôi dự định câu thứ ba có ý nghĩa. Bạn có nghĩ rằng tôi nên rephrase nó, hoặc bạn đã bỏ lỡ điều đó? –

+0

+1 cho các tệp nguồn googling :-) – Angew

0

Điều này là do cách xác định cú pháp bao gồm.

#include <cstdio> có nghĩa là trình biên dịch nên bao gồm các thư viện chuẩn cstdio

#include "cstdio" có nghĩa là trình biên dịch nên cố gắng tìm file "cstdio", tìm kiếm chủ yếu trong thư mục hiện và sử dụng vị trí của các thư viện chuẩn như một dự phòng .

+2

Có hay không '#include <>' hoặc '#include" "' nhìn vào thư mục hiện tại trước tiên hoặc hoàn toàn được thực hiện xác định. –

0

"" so với <> chỉ thay đổi thứ tự tra cứu.

như vậy với

#include "stdio.h" 

precompiler sẽ bắt đầu tra cứu từ thư mục của đơn vị dịch thuật và sau đó di chuyển để xác định trước "bao gồm" các thư mục

Trong khi

#include <stdio.h> 

là cách khác xung quanh

+0

@CharlesBailey Nhưng trong thực tế, nó thường được chấp nhận rằng "..." bao gồm đầu tiên nên tìm trong thư mục có chứa các tập tin với bao gồm. (Mặt khác, tôi không nghĩ rằng bất kỳ trình biên dịch sẽ tìm trong thư mục hiện tại cho một bao gồm, trừ khi bạn vượt qua nó '-I.' hoặc tập tin nó đang đọc là trong thư mục hiện hành.) –

+0

@CharlesBailey, nơi tôi đã nói gì về thư mục ** hiện tại **? –

+0

@aleguna: Rất tiếc, thư mục "thư mục hiện tại" đã đọc "chứa tệp nguồn ban đầu cho đơn vị dịch được biên dịch". Tôi đã lười biếng. –

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