Sự khác biệt giữa #include <filename> và #include “filename” là gì?

2472
quest49 2008-08-22 15:40.

Trong ngôn ngữ lập trình C và C ++, sự khác biệt giữa việc sử dụng dấu ngoặc nhọn và sử dụng dấu ngoặc kép trong một includecâu lệnh, như sau là gì?

  1. #include <filename>
  2. #include "filename"

28 answers

1485
quest49 2008-08-22 15:40.

Trên thực tế, sự khác biệt nằm ở vị trí mà bộ xử lý trước tìm kiếm tệp được bao gồm.

Đối với #include <filename>bộ xử lý tìm kiếm theo cách phụ thuộc vào việc triển khai, thông thường trong các thư mục tìm kiếm được chỉ định trước bởi trình biên dịch / IDE. Phương pháp này thường được sử dụng để bao gồm các tệp tiêu đề thư viện tiêu chuẩn.

Đối với #include "filename"bộ tiền xử lý, trước tiên tìm kiếm trong cùng thư mục với tệp chứa chỉ thị, sau đó đi theo đường dẫn tìm kiếm được sử dụng cho #include <filename>biểu mẫu. Phương pháp này thường được sử dụng để bao gồm các tệp tiêu đề do người lập trình xác định.

Mô tả đầy đủ hơn có sẵn trong tài liệu GCC về đường dẫn tìm kiếm .

734
piCookie 2008-09-17 11:06.

Cách duy nhất để biết là đọc tài liệu triển khai của bạn.

Trong tiêu chuẩn C , mục 6.10.2, đoạn 2 đến đoạn 4 nêu rõ:

  • Chỉ thị tiền xử lý của biểu 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 <>delimiters, và gây ra việc thay thế chỉ thị rằng toàn bộ nội dung của tiêu đề . Cách các địa điểm được chỉ định hoặc tiêu đề được xác định là do việc triển khai xác định.

  • Chỉ thị tiền xử lý của biểu mẫu

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

    gây ra việc thay thế chỉ thị đó bởi toàn bộ nội dung của tệp nguồn được xác định bởi trình tự được chỉ định giữa các "dấu phân cách. Tệp nguồn được đặt tên được tìm kiếm theo cách thức được triển khai xác định. Nếu tìm kiếm này không được hỗ trợ hoặc nếu tìm kiếm không thành công, lệnh sẽ được xử lý lại như thể nó đã đọc

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

    với trình tự được chứa giống hệt nhau (bao gồm các >ký tự, nếu có) từ chỉ thị ban đầu.

  • Chỉ thị tiền xử lý của biểu mẫu

    #include pp-tokens new-line
    

    (không phù hợp với một trong hai biểu mẫu trước đó) được cho phép. Các mã thông báo tiền xử lý sau includetrong chỉ thị được xử lý giống như trong văn bản bình thường. (Mỗi mã định danh hiện được xác định là tên macro được thay thế bằng danh sách mã thông báo tiền xử lý thay thế của nó.) Lệnh dẫn đến sau tất cả các lần thay thế sẽ khớp với một trong hai dạng trước đó. Phương thức mà một chuỗi mã thông báo tiền xử lý giữa a <và một >cặp mã thông báo tiền xử lý hoặc một cặp "ký tự được kết hợp thành một mã thông báo tiền xử lý tên tiêu đề duy nhất được xác định thực hiện.

Các định nghĩa:

  • h-char: bất kỳ thành viên nào của bộ ký tự nguồn ngoại trừ ký tự dòng mới và >

  • q-char: bất kỳ thành viên nào của bộ ký tự nguồn ngoại trừ ký tự dòng mới và "

292
aib 2008-09-09 07:43.

Chuỗi các ký tự giữa <và> chỉ duy nhất một tiêu đề, không nhất thiết phải là một tệp. Việc triển khai hoàn toàn miễn phí để sử dụng chuỗi ký tự như họ muốn. (Tuy nhiên, hầu hết chỉ coi nó như một tên tệp và thực hiện tìm kiếm trong đường dẫn bao gồm , như trạng thái của các bài đăng khác.)

Nếu #include "file"biểu mẫu được sử dụng, việc triển khai trước tiên sẽ tìm kiếm một tệp có tên đã cho, nếu được hỗ trợ. Nếu không (được hỗ trợ) hoặc nếu tìm kiếm không thành công, việc triển khai sẽ hoạt động như thể #include <file>biểu mẫu ( ) khác đã được sử dụng.

Ngoài ra, một dạng thứ ba cũng tồn tại và được sử dụng khi lệnh #includekhông khớp với một trong hai dạng trên. Ở dạng này, một số tiền xử lý cơ bản (chẳng hạn như mở rộng macro) được thực hiện trên "toán hạng" của #includechỉ thị và kết quả được mong đợi là khớp với một trong hai dạng khác.

119
Yann Droneaud 2012-07-20 23:29.

Một số câu trả lời tốt ở đây làm tham chiếu đến tiêu chuẩn C nhưng lại quên tiêu chuẩn POSIX, đặc biệt là hành vi cụ thể của lệnh c99 (ví dụ: trình biên dịch C) .

Theo Thông số kỹ thuật cơ sở nhóm mở, số 7 ,

-Tôi thư mục

Thay đổi thuật toán để tìm kiếm các tiêu đề có tên không phải là tên đường dẫn tuyệt đối để tìm trong thư mục được đặt tên theo tên đường dẫn thư mục trước khi tìm ở các vị trí thông thường. Do đó, các tiêu đề có tên được đặt trong dấu ngoặc kép ("") sẽ được tìm kiếm đầu tiên trong thư mục của tệp có dòng #include , sau đó trong các thư mục có tên trong tùy chọn -I và cuối cùng ở những vị trí thông thường. Đối với tiêu đề có tên được đặt trong dấu ngoặc nhọn ("<>"), tiêu đề sẽ chỉ được tìm kiếm trong các thư mục có tên trong tùy chọn -I và sau đó ở những vị trí thông thường. Các thư mục có tên trong các tùy chọn -I sẽ được tìm kiếm theo thứ tự được chỉ định. Việc triển khai sẽ hỗ trợ ít nhất mười phiên bản của tùy chọn này trong một lần gọi lệnh c99 .

Vì vậy, trong môi trường tuân thủ POSIX, với trình biên dịch C tuân thủ POSIX, #include "file.h"có khả năng sẽ tìm kiếm ./file.hđầu tiên, đâu .là thư mục chứa tệp với #includecâu lệnh, trong khi #include <file.h>, có khả năng sẽ tìm kiếm /usr/include/file.hđầu tiên, /usr/includehệ thống của bạn được xác định ở đâu. các vị trí thông thường cho tiêu đề (có vẻ như nó không được xác định bởi POSIX).

50
Suraj Jain 2017-01-14 18:52.

Tài liệu GCC cho biết như sau về sự khác biệt giữa hai loại:

Cả tệp tiêu đề người dùng và hệ thống đều được bao gồm bằng cách sử dụng chỉ thị tiền xử lý ‘#include’. Nó có hai biến thể:

#include <file>

Biến thể này được sử dụng cho các tệp tiêu đề hệ thống. Nó tìm kiếm một tệp có tên tệp trong danh sách thư mục hệ thống tiêu chuẩn. Bạn có thể thêm trước các thư mục vào danh sách này với -Itùy chọn (xem Lời mời ).

#include "file"

Biến thể này được sử dụng cho các tệp tiêu đề của chương trình của riêng bạn. Nó tìm kiếm một tệp có tên tệp trước tiên trong thư mục chứa tệp hiện tại, sau đó trong các thư mục trích dẫn và sau đó là các thư mục tương tự được sử dụng <file>. Bạn có thể thêm trước các thư mục vào danh sách các thư mục báo giá với -iquotetùy chọn. Đối số của ‘#include’, dù được phân tách bằng dấu ngoặc kép hay dấu ngoặc nhọn, hoạt động giống như một hằng chuỗi trong đó các chú thích không được nhận dạng và tên macro không được mở rộng. Do đó, #include <x/*y>chỉ định bao gồm một tệp tiêu đề hệ thống được đặt tên x/*y.

Tuy nhiên, nếu dấu gạch chéo ngược xảy ra trong tệp, chúng được coi là ký tự văn bản thông thường, không phải ký tự thoát. Không có chuỗi ký tự thoát nào phù hợp với hằng số chuỗi trong C được xử lý. Do đó, #include "x\n\\y"chỉ định một tên tệp chứa ba dấu gạch chéo ngược. (Một số hệ thống diễn giải '\' như một dấu phân tách tên đường dẫn. Tất cả các hệ thống này cũng diễn giải ‘/’theo cùng một cách. Chỉ sử dụng là dễ di động nhất ‘/’.)

Đó là một lỗi nếu có bất kỳ điều gì (ngoài nhận xét) trên dòng sau tên tệp.

46
Stefan Steiger 2011-02-09 01:45.

Nó không:

"mypath/myfile" is short for ./mypath/myfile

với .việc là thư mục của tệp nơi #includechứa tệp và / hoặc thư mục làm việc hiện tại của trình biên dịch và / hoặcdefault_include_paths

<mypath/myfile> is short for <defaultincludepaths>/mypath/myfile

Nếu ./ở trong <default_include_paths>, thì nó không tạo ra sự khác biệt.

Nếu mypath/myfilenằm trong một thư mục bao gồm khác, hành vi là không xác định.

43
adrian 2018-03-12 13:06.

#include <file.h>yêu cầu trình biên dịch tìm kiếm tiêu đề trong thư mục "bao gồm" của nó, ví dụ: đối với MinGW, trình biên dịch sẽ tìm kiếm file.htrong C: \ MinGW \ include \ hoặc bất cứ nơi nào trình biên dịch của bạn được cài đặt.

#include "file"yêu cầu trình biên dịch tìm kiếm thư mục hiện tại (tức là thư mục chứa tệp nguồn) file.

Bạn có thể sử dụng -Icờ cho GCC để nói với nó rằng, khi nó gặp phải một bao gồm có dấu ngoặc nhọn, nó cũng sẽ tìm kiếm các tiêu đề trong thư mục sau đó -I. GCC sẽ coi thư mục sau cờ như thể nó là includesthư mục.

Ví dụ: nếu bạn có một tệp được gọi myheader.htrong thư mục của riêng mình, bạn có thể cho biết #include <myheader.h>bạn đã gọi GCC bằng cờ hay chưa -I .(cho biết rằng nó sẽ tìm kiếm tệp bao gồm trong thư mục hiện tại).

Nếu không có -Icờ, bạn sẽ phải sử dụng #include "myheader.h"để bao gồm tệp hoặc di chuyển myheader.hđến includethư mục của trình biên dịch của bạn.

39
Noname 2008-09-04 02:17.

Các <file>bao gồm kể tiền xử lý để tìm kiếm trong -Idanh bạ và trong các thư mục được xác định trước đầu tiên , sau đó trong thư mục file .c của. Các "file"bao gồm kể tiền xử lý để tìm kiếm thư mục nguồn tập tin của lần đầu tiên , và sau đó trở lại -Ivà được xác định trước. Tất cả các điểm đến đều được tìm kiếm, chỉ có thứ tự tìm kiếm là khác nhau.

Tiêu chuẩn 2011 chủ yếu thảo luận về các tệp bao gồm trong "16.2 Bao gồm tệp nguồn".

2 Chỉ thị tiền xử lý của biểu mẫu

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

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

3 Chỉ thị tiền xử lý của biểu mẫu

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

gây ra việc thay thế chỉ thị đó bởi toàn bộ nội dung của tệp nguồn được xác định bởi trình tự được chỉ định giữa "các dấu phân cách. Tệp nguồn được đặt tên được tìm kiếm theo cách được triển khai xác định. Nếu tìm kiếm này không được hỗ trợ hoặc nếu tìm kiếm không thành công , chỉ thị được xử lý lại như thể nó đọc

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

với trình tự được chứa giống hệt nhau (bao gồm các ký tự>, nếu có) từ chỉ thị ban đầu.

Lưu ý rằng "xxx"biểu mẫu sẽ giảm <xxx>thành biểu mẫu nếu không tìm thấy tệp. Phần còn lại được xác định bởi việc triển khai.

22
skyking 2015-08-18 20:21.

Theo tiêu chuẩn - vâng, chúng khác nhau:

  • Chỉ thị tiền xử lý của biểu 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 <>delimiters, và gây ra việc thay thế chỉ thị rằng toàn bộ nội dung của tiêu đề. Cách các địa điểm được chỉ định hoặc tiêu đề được xác định là do việc triển khai xác định.

  • Chỉ thị tiền xử lý của biểu mẫu

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

    gây ra việc thay thế chỉ thị đó bởi toàn bộ nội dung của tệp nguồn được xác định bởi trình tự được chỉ định giữa các "dấu phân cách. Tệp nguồn được đặt tên được tìm kiếm theo cách thức được triển khai xác định. Nếu tìm kiếm này không được hỗ trợ hoặc nếu tìm kiếm không thành công, lệnh sẽ được xử lý lại như thể nó đã đọc

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

    với trình tự được chứa giống hệt nhau (bao gồm các >ký tự, nếu có) từ chỉ thị ban đầu.

  • Chỉ thị tiền xử lý của biểu mẫu

    #include pp-tokens new-line
    

    (không phù hợp với một trong hai biểu mẫu trước đó) được cho phép. Các mã thông báo tiền xử lý sau includetrong chỉ thị được xử lý giống như trong văn bản bình thường. (Mỗi mã định danh hiện được xác định là tên macro được thay thế bằng danh sách mã thông báo tiền xử lý thay thế của nó.) Lệnh dẫn đến sau tất cả các lần thay thế sẽ khớp với một trong hai dạng trước đó. Phương thức mà một chuỗi mã thông báo tiền xử lý giữa a <và một >cặp mã thông báo tiền xử lý hoặc một cặp "ký tự được kết hợp thành một mã thông báo tiền xử lý tên tiêu đề duy nhất được xác định thực hiện.

Các định nghĩa:

  • h-char: bất kỳ thành viên nào của bộ ký tự nguồn ngoại trừ ký tự dòng mới và >

  • q-char: bất kỳ thành viên nào của bộ ký tự nguồn ngoại trừ ký tự dòng mới và "

Lưu ý rằng tiêu chuẩn không cho biết bất kỳ mối quan hệ nào giữa cách cư xử do việc triển khai xác định. Biểu mẫu đầu tiên tìm kiếm theo một cách do triển khai xác định và biểu mẫu kia theo cách được triển khai xác định (có thể khác). Tiêu chuẩn cũng chỉ rõ rằng một số tệp bao gồm nhất định sẽ có mặt (ví dụ, <stdio.h>).

Về mặt chính thức, bạn phải đọc hướng dẫn sử dụng cho trình biên dịch của mình, tuy nhiên thông thường (theo truyền thống), #include "..."biểu mẫu tìm kiếm thư mục của tệp mà tệp #includeđược tìm thấy trước tiên, sau đó đến các thư mục mà #include <...>biểu mẫu tìm kiếm (đường dẫn bao gồm, ví dụ: tiêu đề hệ thống ).

17
Maxim Egorushkin 2011-02-09 01:45.

Đối với #include ""một trình biên dịch thường tìm kiếm thư mục của tệp chứa bao gồm và sau đó là các thư mục khác. Đối với #include <>trình biên dịch không tìm kiếm thư mục của tệp hiện tại.

17
riderBill 2014-10-15 13:51.

Cảm ơn vì những câu trả lời tuyệt vời, đặc biệt. Adam Stelmaszczyk và piCookie, và aib.

Giống như nhiều lập trình viên, tôi đã sử dụng quy ước không chính thức về việc sử dụng "myApp.hpp"biểu mẫu cho các tệp cụ thể của ứng dụng và <libHeader.hpp>biểu mẫu cho các tệp hệ thống thư viện và trình biên dịch, tức là các tệp được chỉ định trong /IINCLUDEbiến môi trường, trong nhiều năm nghĩ rằng đó là tiêu chuẩn.

Tuy nhiên, tiêu chuẩn C tuyên bố rằng thứ tự tìm kiếm là thực hiện cụ thể, có thể làm cho tính di động phức tạp. Để làm cho vấn đề tồi tệ hơn, chúng tôi sử dụng jam, tự động tìm ra vị trí của các tệp bao gồm. Bạn có thể sử dụng đường dẫn tương đối hoặc tuyệt đối cho các tệp bao gồm của mình. I E

#include "../../MyProgDir/SourceDir1/someFile.hpp"

Các phiên bản cũ hơn của MSVS yêu cầu dấu gạch chéo ngược kép (\\), nhưng bây giờ điều đó không bắt buộc. Tôi không biết nó đã thay đổi khi nào. Chỉ cần sử dụng dấu gạch chéo về phía trước để tương thích với 'nix (Windows sẽ chấp nhận điều đó).

Nếu bạn thực sự lo lắng về điều đó, hãy sử dụng "./myHeader.h"tệp bao gồm trong cùng thư mục với mã nguồn (dự án rất lớn hiện tại của tôi có một số tên tệp bao gồm trùng lặp nằm rải rác - thực sự là một vấn đề quản lý cấu hình).

Đây là phần giải thích MSDN được sao chép vào đây để bạn tiện theo dõi).

Biểu mẫu được trích dẫn

Bộ tiền xử lý tìm kiếm các tệp bao gồm theo thứ tự sau:

  1. Trong cùng thư mục với tệp có chứa câu lệnh #include.
  2. Trong các thư mục của tệp hiện đang mở bao gồm các tệp, theo thứ tự ngược lại mà
    chúng đã được mở. Việc tìm kiếm bắt đầu trong thư mục của tệp bao gồm cha và
    tiếp tục đi lên qua các thư mục của bất kỳ tệp bao gồm ông bà nào.
  3. Dọc theo đường dẫn được chỉ định bởi từng /Itùy chọn trình biên dịch.
  4. Dọc theo các đường dẫn được chỉ định bởi INCLUDEbiến môi trường.

Dạng dấu ngoặc nhọn

Bộ tiền xử lý tìm kiếm các tệp bao gồm theo thứ tự sau:

  1. Dọc theo đường dẫn được chỉ định bởi từng /Itùy chọn trình biên dịch.
  2. Khi biên dịch xảy ra trên dòng lệnh, dọc theo các đường dẫn được chỉ định bởi INCLUDEbiến môi trường.
16
Denis Ros 2011-10-26 02:35.

Ít nhất đối với phiên bản GCC <= 3.0, dạng dấu ngoặc nhọn không tạo ra sự phụ thuộc giữa tệp được bao gồm và tệp được bao gồm.

Vì vậy, nếu bạn muốn tạo các quy tắc phụ thuộc (sử dụng tùy chọn GCC -M cho exemple), bạn phải sử dụng biểu mẫu được trích dẫn cho các tệp cần được bao gồm trong cây phụ thuộc.

(Xem http://gcc.gnu.org/onlinedocs/cpp/Invocation.html )

14
Chayim Friedman 2018-04-12 20:36.

Khi bạn sử dụng #include <filename>, bộ xử lý trước sẽ tìm kiếm tệp trong thư mục của tệp tiêu đề C \ C ++ (stdio.h \ cstdio, string, vector, v.v.). Tuy nhiên, khi bạn sử dụng #include "tên tệp": trước tiên, bộ xử lý trước đang tìm kiếm tệp trong thư mục hiện tại và nếu nó không có ở đây - ông ta sẽ tìm nó trong thư mục của tệp tiêu đề C \ C ++.

12
Damon 2011-02-09 02:02.

#Include với dấu ngoặc nhọn sẽ tìm kiếm "danh sách địa điểm phụ thuộc vào việc triển khai" (một cách nói rất phức tạp để nói "tiêu đề hệ thống") cho tệp được đưa vào.

#Include kèm theo dấu ngoặc kép sẽ chỉ tìm kiếm một tệp (và "theo cách phụ thuộc vào việc triển khai", bleh). Có nghĩa là, trong tiếng Anh thông thường, nó sẽ cố gắng áp dụng đường dẫn / tên tệp mà bạn ném vào nó và sẽ không thêm đường dẫn hệ thống hoặc giả mạo đường dẫn đó.

Ngoài ra, nếu #include "" không thành công, nó sẽ được đọc lại là #include <> theo tiêu chuẩn.

Các tài liệu gcc có (biên dịch cụ thể) mô tả mà mặc dù là đặc trưng cho gcc và không phải là tiêu chuẩn, là dễ dàng hơn nhiều để hiểu hơn cuộc nói chuyện luật sư theo phong cách của các tiêu chuẩn ISO.

10
Barbara 2011-09-29 10:37.
#include "filename" // User defined header
#include <filename> // Standard library header.

Thí dụ:

Tên tệp ở đây là Seller.h:

#ifndef SELLER_H     // Header guard
#define SELLER_H     // Header guard

#include <string>
#include <iostream>
#include <iomanip>

class Seller
{
    private:
        char name[31];
        double sales_total;

    public:
        Seller();
        Seller(char[], double);
        char*getName();

#endif

Trong triển khai lớp (ví dụ, Seller.cppvà trong các tệp khác sẽ sử dụng tệp Seller.h), tiêu đề do người dùng xác định bây giờ sẽ được bao gồm, như sau:

#include "Seller.h"
10
AndroidDev 2012-12-17 21:54.
  • #include <> dành cho các tệp tiêu đề được xác định trước

Nếu tệp tiêu đề được xác định trước thì bạn chỉ cần viết tên tệp tiêu đề trong dấu ngoặc nhọn và nó sẽ giống như thế này (giả sử chúng ta có tên tệp tiêu đề được xác định trước là iostream):

#include <iostream>
  • #include " " dành cho các tệp tiêu đề mà người lập trình xác định

Nếu bạn (người lập trình) đã viết tệp tiêu đề của riêng mình thì bạn sẽ viết tên tệp tiêu đề trong dấu ngoặc kép. Vì vậy, giả sử bạn đã viết một tệp tiêu đề có tên myfile.h, thì đây là một ví dụ về cách bạn sẽ sử dụng chỉ thị include để bao gồm tệp đó:

#include "myfile.h"
9
sp2danny 2014-02-26 00:49.

Nhiều câu trả lời ở đây tập trung vào các đường dẫn mà trình biên dịch sẽ tìm kiếm để tìm tệp. Trong khi đây là những gì hầu hết các trình biên dịch làm, một trình biên dịch phù hợp được phép lập trình trước với các hiệu ứng của các tiêu đề tiêu chuẩn và coi #include <list>như một công tắc, và nó không cần tồn tại dưới dạng một tệp nào cả.

Đây không hoàn toàn là giả thuyết. Có ít nhất một trình biên dịch hoạt động theo cách đó. #include <xxx>Chỉ nên sử dụng với các tiêu đề tiêu chuẩn.

9
Christy Wald 2017-01-24 03:36.
#include <abc.h>

được sử dụng để bao gồm các tệp thư viện tiêu chuẩn. Vì vậy, trình biên dịch sẽ kiểm tra các vị trí mà các tiêu đề thư viện tiêu chuẩn đang cư trú.

#include "xyz.h"

sẽ yêu cầu trình biên dịch bao gồm các tệp tiêu đề do người dùng xác định. Vì vậy, trình biên dịch sẽ kiểm tra các tệp tiêu đề này trong thư mục hiện tại hoặc -Icác thư mục được xác định.

7
virat 2016-02-17 23:07.

Trong C ++, bao gồm một tệp theo hai cách:

Đầu tiên là #include, thông báo cho bộ xử lý trước tìm kiếm tệp ở vị trí mặc định được xác định trước. Vị trí này thường là một biến môi trường INCLUDE biểu thị đường dẫn để bao gồm các tệp.

Và loại thứ hai là #include "tên tệp" cho bộ xử lý trước để tìm kiếm tệp trong thư mục hiện tại trước tiên, sau đó tìm kiếm tệp đó trong các vị trí được xác định trước mà người dùng đã thiết lập.

7
Darshan L 2018-08-17 23:59.

Biểu mẫu 1 - #include <xxx>

Đầu tiên, hãy tìm kiếm sự hiện diện của tệp tiêu đề trong thư mục hiện tại từ nơi chỉ thị được gọi. Nếu không tìm thấy, nó sẽ tìm kiếm trong danh sách các thư mục hệ thống tiêu chuẩn được cấu hình sẵn.

Biểu mẫu 2 - #include "xxx"

Điều này tìm kiếm sự hiện diện của tệp tiêu đề trong thư mục hiện tại từ nơi chỉ thị được gọi.


Danh sách thư mục tìm kiếm chính xác phụ thuộc vào hệ thống đích, cách GCC được cấu hình và nơi nó được cài đặt. Bạn có thể tìm thấy danh sách thư mục tìm kiếm của trình biên dịch GCC của mình bằng cách chạy nó với tùy chọn -v.

Bạn có thể thêm các thư mục bổ sung vào đường dẫn tìm kiếm bằng cách sử dụng - I dir , điều này khiến dir được tìm kiếm sau thư mục hiện tại (đối với dạng trích dẫn của chỉ thị) và trước các thư mục hệ thống tiêu chuẩn.


Về cơ bản, biểu mẫu "xxx" không có gì khác ngoài tìm kiếm trong thư mục hiện tại; nếu không tìm thấy rơi trở lại biểu mẫu

6
srsci 2014-08-28 09:36.

Các #include <filename>được sử dụng khi một tập tin hệ thống được nhắc đến. Đó là tệp tiêu đề có thể được tìm thấy tại các vị trí mặc định của hệ thống như /usr/includehoặc /usr/local/include. Đối với các tệp của riêng bạn cần được đưa vào chương trình khác, bạn phải sử dụng #include "filename"cú pháp.

6
jigar karangiya 2018-03-29 01:35.

"<filename>" tìm kiếm trong các vị trí thư viện C tiêu chuẩn

trong khi "tên tệp" cũng tìm kiếm trong thư mục hiện tại.

Tốt nhất, bạn nên sử dụng <...> cho các thư viện C chuẩn và "..." cho các thư viện mà bạn viết và có trong thư mục hiện tại.

5
Eakan Gopalakrishnan 2013-06-05 05:19.

Quy tắc chung đơn giản là sử dụng dấu ngoặc nhọn để bao gồm các tệp tiêu đề đi kèm với trình biên dịch. Sử dụng dấu ngoặc kép để bao gồm bất kỳ tệp tiêu đề nào khác. Hầu hết các trình biên dịch đều làm theo cách này.

1.9 - Tệp tiêu đề giải thích chi tiết hơn về các lệnh tiền xử lý. Nếu bạn là một lập trình viên mới, trang đó sẽ giúp bạn hiểu tất cả những điều đó. Tôi đã học được nó từ đây và tôi đã theo dõi nó trong công việc.

4
Hafiz Shehbaz Ali 2015-04-03 06:50.
#include <filename>

được sử dụng khi bạn muốn sử dụng tệp tiêu đề của hệ thống C / C ++ hoặc các thư viện trình biên dịch. Các thư viện này có thể là stdio.h, string.h, math.h, v.v.

#include "path-to-file/filename"

được sử dụng khi bạn muốn sử dụng tệp tiêu đề tùy chỉnh của riêng mình, tệp này nằm trong thư mục dự án của bạn hoặc ở một nơi khác.

Để biết thêm thông tin về bộ tiền xử lý và tiêu đề. Đọc C - Bộ tiền xử lý .

4
Kalana 2019-12-27 19:18.

#include <filename>

  • Bộ tiền xử lý tìm kiếm theo cách phụ thuộc vào việc triển khai. Nó cho trình biên dịch biết thư mục tìm kiếm nơi chứa các tệp tiêu đề hệ thống.
  • Phương pháp này thường sử dụng để tìm các tệp tiêu đề tiêu chuẩn.

#include "filename"

  • Điều này yêu cầu trình biên dịch tìm kiếm các tệp tiêu đề nơi chương trình đang chạy. Nếu không thành công, nó sẽ hoạt động như thế nào #include <filename>và tìm kiếm tệp tiêu đề đó tại nơi lưu trữ tệp tiêu đề hệ thống.
  • Phương pháp này thường được sử dụng để xác định các tệp tiêu đề do người dùng xác định (tệp tiêu đề do người dùng tạo). Ở đó, không sử dụng điều này nếu bạn muốn gọi thư viện tiêu chuẩn vì nó mất nhiều thời gian biên dịch hơn #include <filename>.
2
Hogstrom 2018-10-04 08:51.

Để xem thứ tự tìm kiếm trên hệ thống của bạn bằng gcc, dựa trên cấu hình hiện tại, bạn có thể thực hiện lệnh sau. Bạn có thể tìm thêm thông tin chi tiết về lệnh này tại đây

cpp -v /dev/null -o /dev/null

Apple LLVM phiên bản 10.0.0 (clang-1000.10.44.2)
Mục tiêu: x86_64-apple-darwin18.0.0
Mô hình chủ đề: posix InstalledDir: Library / Developer / CommandLineTools / usr / bin
"/ Library / Developer / CommandLineTools / usr / bin / clang "-cc1 -triple x86_64-apple-macosx10.14.0 -Wdeprecated-objc-isa-using -Werror = bị phản đối-objc-isa-using -E -disable-free -disable-llvm-Verifier -discard-value-names -main -file-name null -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fno-precision-return -masm-verbose -munwind -boards -target-cpu penryn -dwarf-column- info -debugger-tuning = lldb -target-linker-version 409.12 -v -resource-dir /Library/Developer/CommandLineTools/usr/lib/clang/10.0.0 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14 .sdk -I / usr / local / include -fdebug-compilation-dir / Users / hogstrom -ferror-limit 19 -fmessage-length 80 -stack-protectionor 1 -fblocks -fencode-Extended-block-signature -fobjc-runtime = macosx-10.14.0 -fmax-type-align = 16 -fdiagnostics-show-option -fcolor-Diagnos tics -traditional-cpp -o - -xc / dev / null
clang -cc1 phiên bản 10.0.0 (clang-1000.10.44.2) mục tiêu mặc định x86_64-apple-darwin18.0.0 bỏ qua thư mục không tồn tại "/ Library / Developer / CommandLineTools / SDKs / MacOSX10.14.sdk / usr / local / include "bỏ qua thư mục không tồn tại" /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/Library/Frameworks "
#include" ... "tìm kiếm bắt đầu tại đây:
#include <. ..> tìm kiếm bắt đầu tại đây:
/ usr / local / include
/Library/Developer/CommandLineTools/usr/lib/clang/10.0.0/include
/ Library / Developer / CommandLineTools / usr / include
/ Library / Developer / CommandLineTools / SDKs / MacOSX10.14.sdk / usr / bao gồm
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks (thư mục khung)
Cuối danh sách tìm kiếm.

1
IAmAUser 2020-03-02 13:11.
#include <file> 

Bao gồm một tệp có thư mục bao gồm mặc định.

#include "file" 

Bao gồm một tệp trong thư mục hiện tại mà nó đã được biên dịch.

0
Saptarshi das 2020-11-24 22:08.

Nói chung, sự khác biệt là nơi bộ xử lý trước tìm kiếm tệp tiêu đề:

#include là một chỉ thị tiền xử lý để bao gồm tệp tiêu đề. Cả #include đều được sử dụng để thêm hoặc bao gồm tệp tiêu đề trong chương trình, nhưng trước tiên là để bao gồm tệp tiêu đề hệ thống và sau đó là một tệp cho tệp tiêu đề do người dùng xác định.

  1. #include <filename> được sử dụng để bao gồm tệp tiêu đề thư viện hệ thống trong chương trình, có nghĩa là bộ xử lý trước C / C ++ sẽ tìm kiếm tên tệp nơi lưu trữ tệp thư viện C hoặc tệp tiêu đề hệ thống được xác định trước được lưu trữ.
  2. #include "tên tệp" được sử dụng để bao gồm tệp tiêu đề do người dùng xác định trong chương trình, có nghĩa là bộ xử lý trước C / C ++ sẽ tìm kiếm tên tệp trong thư mục hiện tại mà chương trình đang ở và sau đó đi theo đường dẫn tìm kiếm được sử dụng cho #include <tên tệp>

Kiểm tra gcc docs gcc include files

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Trong Saturday Night Live, The Bachelor is Bland và Tina Fey trở lại với vai 'Crazy' Sarah Palin

Trong Saturday Night Live, The Bachelor is Bland và Tina Fey trở lại với vai 'Crazy' Sarah Palin

Sau khi Sarah Palin tán thành Donald Trump vào đầu tuần này, gần như không thể tránh khỏi việc Tina Fey sẽ trở lại Saturday Night Live để thăm lại ấn tượng Palin cổ điển của cô. Và Fey chắc chắn đã không làm thất vọng, cô ấy đã đưa ra một lời khen ngợi không hề nhẹ về bài phát biểu chứng thực Iowa quanh co và khó hiểu của Palin trong khi Trump của Darrell Hammond đưa ra bình luận xuyên suốt.

Đây có phải là sự khởi đầu cho sự kết thúc của việc giam giữ Brittney Griner?

Đây có phải là sự khởi đầu cho sự kết thúc của việc giam giữ Brittney Griner?

Brittney Griner (r.) Ngay từ đầu, thân phận của Brittney Griner đã là tình huống con tin Mỹ độc nhất trong lịch sử hiện đại.

Tom Brady là bộ tứ vệ đầu tiên cuối cùng có thể giúp Julio Jones có hơn 10 lần chạm bóng trong một mùa giải

Tom Brady là bộ tứ vệ đầu tiên cuối cùng có thể giúp Julio Jones có hơn 10 lần chạm bóng trong một mùa giải

Chúng ta có thể thấy nhiều hơn nữa về một Julio Jones khỏe mạnh trong khu vực cuối năm nay. John Parker Wilson, Greg McElroy, A.

Đó phải là Đức

Đó phải là Đức

Đối với đội tuyển Anh, không có kẻ thủ ác nào lớn hơn Hầu hết các cổ động viên Anh, nếu không muốn nói là tất cả, hẳn sẽ phải gật gù khi tiếng còi mãn cuộc của trận bán kết lượt về W Euro 2022 vang lên. Bởi vì nó báo hiệu rằng Đức sẽ chờ đợi ở Wembley trong trận chung kết với Anh và là điều duy nhất giữa Anh và chiếc cúp lớn đầu tiên của đội tuyển nữ.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language