Câu hỏi Sự khác nhau giữa #include và #include “filename” là gì?


Trong ngôn ngữ lập trình C và C ++, sự khác nhau 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 include tuyên bố, như sau?

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

1813
2017-08-22 01:40


gốc


gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC6 - legends2k
GCC tìm đâu để tìm tập tin tiêu đề của nó - theoretisch


Các câu trả lời:


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

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

Dành cho #include "filename" bộ tiền xử lý tìm kiếm đầu tiên trong cùng thư mục với tệp chứa chỉ thị và sau đó đi theo đường dẫn tìm kiếm được sử dụng cho #include <filename> hình thức. 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 mô tả đầy đủ hơn có sẵn trong GCC tài liệu trên đường dẫn tìm kiếm.


1046
2017-08-22 01:40



Câu lệnh: "các tìm kiếm tiền xử lý trong cùng một thư mục ..." có thể đúng trong thực tế nhưng tiêu chuẩn nói rằng tệp nguồn được đặt tên là "được tìm kiếm theo cách được định nghĩa thực hiện". Xem câu trả lời từ piCookie. - Richard Corden
Mặc dù câu trả lời của bạn có vẻ là "đúng", bởi vì đây là số lượng triển khai hoạt động theo quy ước, bạn nên xem xét kỹ các câu trả lời của aib và piCookie. Cả hai đều chỉ ra (được ủng hộ bởi từ ngữ của tiêu chuẩn C) rằng sự khác biệt thực sự bao gồm "tiêu đề" so với "tệp nguồn" (và không, điều này không có nghĩa là ".h" so với ". c "). "Tệp nguồn" trong ngữ cảnh này có thể (và thường là, và hầu như luôn luôn phải là) một tệp ".h". Tiêu đề không nhất thiết phải là tệp (trình biên dịch có thể bao gồm tiêu đề được mã hóa tĩnh, không phải trong tệp). - Dan Moulding
"... bộ tiền xử lý tìm kiếm trong cùng một thư mục với tệp đang được biên dịch để bao gồm tệp." Tuyên bố này không hoàn toàn chính xác. Tôi đã quan tâm đến câu hỏi này bởi vì tôi tò mò câu trả lời thực sự là gì, nhưng tôi biết điều này là không đúng bởi vì ít nhất với gcc khi bạn chỉ định một đường dẫn bổ sung kèm theo -I sẽ tìm kiếm các tệp được chỉ định với #include "tên tệp. h " - Gabriel Southern
Những người không thích câu trả lời, xin vui lòng, đưa ra một ví dụ thực tế, nơi mà nó là sai. - 0kcats
Chắc chắn, gần đây tôi đã trộn lẫn các cú pháp này khi bao gồm các tiêu đề từ thư viện 'cùng' và kết thúc bằng các lỗi định nghĩa lại. Nếu tôi hiểu đúng, #include <...> đã sử dụng gói cài đặt trên hệ thống và #include "..." đã sử dụng phiên bản kho lưu trữ lân cận. Tôi có thể có những thứ ngược lại. Dù bằng cách nào, bảo vệ bao gồm trong tiêu đề đóng gói được đặt trước bằng dấu gạch dưới. (Nó có thể là một quy ước cho các gói hoặc có thể là một cách để cố ý ngăn chặn việc trộn lẫn hai, mặc dù phiên bản vòng loại sẽ có ý nghĩa hơn với tôi.) - John P


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

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

  • Một 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í được xác định thực hiện cho một tiêu đề được xác định duy nhất bởi chuỗi được chỉ định giữa < và > delimiters, và gây ra việc thay thế chỉ thị đó bằng toàn bộ nội dung của phần đầ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.

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

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

    làm cho việc thay thế chỉ thị đó bằng toàn bộ nội dung của tệp nguồn được xác định bởi chuỗi được chỉ định giữa " delimiters. 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ị sẽ được xử lý lại như thể nó đã đọc

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

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

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

    #include pp-tokens new-line
    

    (không khớp với một trong hai hình thức trước) được cho phép. Các mã thông báo tiền xử lý sau include trong chỉ thị được xử lý giống như trong văn bản thông thường. (Mỗi định danh hiện được định nghĩa là tên macro được thay thế bằng danh sách thay thế của mã thông báo tiền xử lý.) Chỉ thị kết quả sau khi tất cả các thay thế phải khớp với một trong hai hình thức trước đó. Phương thức mà theo đó một chuỗi các thẻ tiền xử lý giữa một < và một > cặp tiền xử lý 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 thực hiện xác định.

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à "


594
2017-09-16 21:06



Có liên quan: triển khai trong g ++ và trong trực quan c ++ - Alexander Malakhov
@piCookie cả tìm kiếm <filename> và "filename" cho các vị trí được xác định. Vì vậy, sự khác biệt là gì ? - onmyway133
@Stefan, tôi chỉ trích dẫn tiêu chuẩn không nói gì về INCLUDE_PATH. Việc triển khai của bạn có thể thực hiện điều đó và tôi có thể không thực hiện điều đó. Câu hỏi ban đầu là chung C và không cụ thể gcc (mà tôi không nghĩ rằng sử dụng INCLUDE_PATH) hoặc Microsoft C (mà tôi nghĩ) hoặc bất kỳ khác, do đó, nó không thể được trả lời chung nhưng thay vì tài liệu của mỗi thực hiện phải được tham chiếu. - piCookie
Như với tất cả các tình huống này, các ví dụ cụ thể (đặc biệt là các kịch bản phổ biến) rất hữu ích và được đánh giá cao. Câu trả lời chung chung không cần thiết sẽ không có nhiều sử dụng thực tế. - vargonian
"Đây là cách tiêu chuẩn C có thể tiết lộ và không trả lời câu hỏi của bạn" - anatolyg


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

Nếu #include "file" hình thức được sử dụng, việc thực hiện đầu tiên tìm một tập tin của tên cho trước, nếu được hỗ trợ. Nếu không (được hỗ trợ), hoặc nếu tìm kiếm thất bại, việc triển khai hoạt động như thể khác (#include <file>) đã được sử dụng.

Ngoài ra, một hình thức thứ ba tồn tại và được sử dụng khi #include chỉ thị không khớp với một trong các biểu mẫu ở trên. Trong biểu mẫu 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 #include chỉ thị và kết quả dự kiến ​​sẽ khớp với một trong hai dạng khác.


215
2017-09-08 17:43



1, đây có lẽ là câu trả lời ngắn gọn và chính xác nhất ở đây. Theo tiêu chuẩn (mà piCookie trích dẫn từ trong câu trả lời của ông), chỉ thực sự khác biệt là "tiêu đề" so với "tệp nguồn". Cơ chế tìm kiếm được định nghĩa theo cách thực hiện. Sử dụng dấu ngoặc kép có nghĩa là bạn dự định bao gồm "tệp nguồn", trong khi dấu ngoặc nhọn có nghĩa là bạn dự định bao gồm "tiêu đề", như bạn nói, có thể không phải là một tệp nào cả. - Dan Moulding
Xem bình luận của Dan Moulding về câu trả lời của quest49; tiêu đề chuẩn không phải ở dạng tệp, chúng có thể được tích hợp sẵn. - aib
Tôi đã đọc "tiêu đề chuẩn này không phải ở dạng tệp" trong một thập kỷ. Chăm sóc để cung cấp một ví dụ thực tế? - Maxim Egorushkin
@Maxim Yegorushkin: Tôi không thể nghĩ ra bất kỳ ví dụ thực tế nào hiện có; tuy nhiên, không có trình biên dịch C11 hoàn chỉnh nào có thể tồn tại cho MS-DOS trừ khi các tiêu đề không phải là các tệp. Điều này là do một số tên tiêu đề C11 không tương thích với giới hạn tên tệp MS-DOS "8,3". - Dan Moulding
@MaximEgorushkin: Trình biên dịch VAX / VMS C giữ tất cả các tiêu đề thư viện thời gian chạy C trong một tệp thư viện văn bản duy nhất (tương tự như một tệp lưu trữ unix) và sử dụng chuỗi giữa < và >là chìa khóa để lập chỉ mục vào thư viện. - Adrian McCarthy


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

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

-TÔI  danh mục

Thay đổi thuật toán để tìm 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ên danh mục tên đường dẫn trước khi tìm kiếm ở các địa điểm 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 với #include dòng, sau đó trong các thư mục có tên trong -TÔI tùy chọn và cuối cùng ở những nơi thông thường. Đối với các 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ÔI tùy chọn và sau đó ở những nơi thông thường. Thư mục có tên trong -TÔI tùy chọn 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 c99 lệnh gọi.

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 #include tuyên bố, trong khi #include <file.h>, có khả năng sẽ tìm kiếm /usr/include/file.h đầu tiên, ở đâu /usr/include là hệ thống của bạn được xác định những nơi thông thường cho tiêu đề (có vẻ như không được xác định bởi POSIX).


92
2017-07-20 09:29



Nguồn chính xác của văn bản là gì? Là nó từ một phần tiêu chuẩn của IEEE Std 1003.1, 2013? - osgx
@osgx: từ ngữ đó (hoặc thứ gì đó cực kỳ giống nhau) được tìm thấy trong đặc tả POSIX cho c99 - đó là tên POSIX cho trình biên dịch C. (Tiêu chuẩn POSIX 2008 khó có thể tham khảo C11; bản cập nhật 2013 cho POSIX 2008 không thay đổi tiêu chuẩn C mà nó đề cập đến.) - Jonathan Leffler


Nó có:

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

với . là thư mục của tệp trong đó #include được chứa trong và / hoặc thư mục làm việc hiện tại của trình biên dịch và / hoặc default_include_paths

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

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

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


36
2018-02-08 11:45



Không, #include "mypath/myfile" không tương đương với #include "./mypath/myfile". Khi câu trả lời của piCookie cho biết, dấu ngoặc kép cho trình biên dịch tìm kiếm theo cách thức được triển khai - bao gồm tìm kiếm ở các địa điểm được chỉ định cho #include <...>. (Thực ra, nó có thể là tương đương, nhưng chỉ vì, ví dụ, /usr/include/mypath/myfile có thể được gọi là /usr/include/./mypath/myfile - ít nhất là trên các hệ thống giống Unix.) - Keith Thompson
@ Keith Thompson: Đúng vậy, tôi đang nghĩ về chiếc hộp Linux của mình. Rõ ràng nó có thể khác. Mặc dù trong thực tế, Windows là hệ điều hành non-Posix cũng không diễn giải / làm dấu tách đường dẫn, và ./ cũng tồn tại. - Stefan Steiger
the -L dirpath tùy chọn rồi thêm dirpath đến defaultincludepaths, trái ngược với việc đưa ra một ý nghĩa khác cho . (như đã nói ở trên). Điều này có kết quả mong đợi rằng cả hai #include "..." và #include <...> tìm kiếm ở dirpath - Protongun
Tôi nghĩ rằng câu trả lời này là không chính xác, vì nó ngụ ý rằng các tiêu đề đi kèm với dấu ngoặc kép luôn được tìm kiếm trong thư mục làm việc hiện tại. Cơ chế tìm kiếm là cách chi tiết hơn; câu trả lời này chưa hoàn thành. Tôi không thêm bình luận này để phàn nàn hoặc rên rỉ, nhưng bởi vì hệ thống yêu cầu tôi thêm một bình luận để giải thích tại sao tôi đã bình chọn câu trả lời này. - Carlo Wood


Tài liệu GCC nói sau đây về sự khác biệt giữa hai:

Cả hai tệp tiêu đề hệ thống và người dùng đượ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 tin có tên tập tin trong một danh sách tiêu chuẩn của các thư mục hệ thống. Bạn có thể thêm các thư mục vào danh sách này với -I tùy chọn (xem Yêu cầu).

#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 tin có tên tập tin đầu tiên trong thư mục chứa tập tin hiện tại, sau đó trong các thư mục báo giá và sau đó các thư mục tương tự được sử dụng cho <file>. Bạn có thể thêm các thư mục vào danh sách các thư mục báo giá với -iquote Tùy chọn.     Đối số của ‘#include’, cho dù được phân cách bằng dấu ngoặc kép hay dấu ngoặc nhọn, hoạt động giống như chuỗi liên tục trong các nhận xét đó không được nhận dạng và tên macro không được mở rộng. Như vậy, #include <x/*y> chỉ định bao gồm tệp tiêu đề hệ thống có 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 được thoát khỏi ký 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ý. Như vậy,#include "x\n\\y"chỉ định tên tệp có ba dấu gạch chéo ngược. (Một số hệ thống giải thích ‘\’ làm dấu tách đườ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. Nó là xách tay nhất để sử dụng chỉ ‘/’.)

Nó là một lỗi nếu có bất cứ điều gì (ngoài ý kiến) trên dòng sau tên tập tin.


30
2018-01-14 04:52





Các <file> bao gồm thông báo cho bộ tiền xử lý để tìm kiếm -I thư mục và trong các thư mục được xác định trước Đầu tiên, sau đó trong thư mục của tệp .c. Các "file" bao gồm cho bộ tiền xử lý tìm kiếm thư mục của tệp nguồn Đầu tiên, và sau đó trở lại -I và được xác định trước. Tuy nhiên, tất cả các đích được tìm kiếm, chỉ có thứ tự tìm kiếm khác nhau.

Tiêu chuẩn năm 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í được xác định thực hiện cho một tiêu đề được xác định duy nhất bởi   chuỗi được chỉ định giữa <và> dấu phân tách 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à   thực hiện 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ằng toàn bộ nội dung của tệp nguồn được xác định bởi   chuỗi được chỉ định giữa "dấu phân cách. Tệp nguồn được đặt tên là   tìm kiếm theo cách thức được thực hiện. Nếu tìm kiếm này là   không được hỗ trợ hoặc nếu tìm kiếm không thành công, chỉ thị sẽ được xử lý lại dưới dạng   nếu nó đọc

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

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

Lưu ý rằng "xxx" biểu mẫu giảm xuống <xxx> nếu không tìm thấy tệp. Phần còn lại được xác định thực hiện.


23
2017-09-03 12:17



Bạn có thể cung cấp tham chiếu đến nơi trong tiêu chuẩn C này không -I doanh nghiệp được chỉ định? - juanchopanza
@juanchopanza đã xong. Xem thêm câu trả lời hàng đầu :) - Arkadiy
Tôi không thấy tham chiếu đến -I. - juanchopanza
Đó là phần "thực hiện được xác định". - Arkadiy
Thở dài. Tôi trả lời của bạn, bạn làm cho nó âm thanh như thế là một cái gì đó được chỉ định trong ngôn ngữ. - juanchopanza


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

  • Một 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í được xác định thực hiện cho một tiêu đề được xác định duy nhất bởi chuỗi được chỉ định giữa < và > delimiters, và gây ra việc thay thế chỉ thị đó bằng toàn bộ nội dung của phần đầ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.

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

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

    làm cho việc thay thế chỉ thị đó bằng toàn bộ nội dung của tệp nguồn được xác định bởi chuỗi được chỉ định giữa " delimiters. 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ị sẽ được xử lý lại như thể nó đã đọc

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

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

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

    #include pp-tokens new-line
    

    (không khớp với một trong hai hình thức trước) được cho phép. Các mã thông báo tiền xử lý sau include trong chỉ thị được xử lý giống như trong văn bản thông thường. (Mỗi định danh hiện được định nghĩa là tên macro được thay thế bằng danh sách thay thế của mã thông báo tiền xử lý.) Chỉ thị kết quả sau khi tất cả các thay thế phải khớp với một trong hai hình thức trước đó. Phương thức mà theo đó một chuỗi các thẻ tiền xử lý giữa một < và một > cặp tiền xử lý 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 thực hiện xác định.

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ử được thực hiện. Các hình thức tìm kiếm đầu tiên trong một cách thực hiện xác định, và khác trong một (có thể khác) cách thực hiện xác định. Tiêu chuẩn cũng chỉ định rằng một số tệp nhất định phải có mặt (ví dụ: <stdio.h>).

Chính thức bạn phải đọc hướng dẫn cho trình biên dịch của bạn, 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 trong đó #include đã được tìm thấy đầu tiên, và sau đó là các thư mục mà #include <...> tìm kiếm biểu mẫu (đường dẫn bao gồm, ví dụ: tiêu đề hệ thống).


16
2017-08-18 06:21



Điều này chủ yếu chỉ là văn bản giống như câu trả lời của piCookie từ bảy năm sớm hơn. - Kyle Strand
@KyleStrand Đó là vì cùng một văn bản là trích dẫn của phần có liên quan trong tiêu chuẩn - văn bản đó Nên giống hệt nhau. Câu trả lời thực tế không phải là cùng một văn bản và có phần khác nhau - trong khi tôi cũng nhận ra rằng nó sẽ được viết trong tài liệu hướng dẫn thực hiện, tôi cũng lưu ý rằng có một cách truyền thống được diễn giải (hầu hết hoặc tất cả các trình biên dịch mà tôi đã sử dụng) . - skyking
IMO đây là câu trả lời tốt nhất ở đây, bởi vì nó bao gồm cả những gì tiêu chuẩn nói và những gì hầu hết các trình biên dịch thực sự làm. - plugwash


Cảm ơn các 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 của việc sử dụng "myApp.hpp" biểu mẫu cho các tệp ứng dụng cụ thể 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 /I và INCLUDE biến môi trường, trong nhiều năm suy nghĩ đó là tiêu chuẩn.

Tuy nhiên, tiêu chuẩn C nói rằng thứ tự tìm kiếm được thực hiện cụ thể, điều này 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 mứt, mà tự động tìm ra nơi bao gồm các tập tin. 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 bạn. I E.

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

Các phiên bản MSVS cũ hơn yêu cầu hai dấu gạch chéo ngược (\\), nhưng bây giờ không bắt buộc. Tôi không biết khi nào nó thay đổi. 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 là có thật không lo lắng về nó, sử dụng "./myHeader.h" cho một tập tin bao gồm trong cùng một thư mục như mã nguồn (hiện tại của tôi, dự án rất lớn có một số trùng lặp bao gồm tên tập tin nằm rải rác về - thực sự là một vấn đề quản lý cấu hình).

Đây là Giải thích MSDN sao chép ở đây để thuận tiện cho bạn).

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

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

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

Dạng khung góc

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

  1. Dọc theo con đường được chỉ định bởi mỗi /I tù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 INCLUDE biến môi trường.

12
2017-10-14 23:51





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

Vì vậy, nếu bạn muốn tạo các quy tắc phụ thuộc (bằng cách 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 đưa vào cây phụ thuộc.

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


11
2017-10-25 12:35