2010-05-10 38 views
10

thể trùng lặp:
What is the difference between using #include<filename> and #include<filename.h> in c++C++ bao gồm có và không có .h

Tôi chưa bao giờ nhận thấy nó thực hiện bất kỳ sự khác biệt hay không tôi bao gồm các .h vào cuối của một bao gồm, vì vậy tôi đã luôn bỏ qua ý nghĩa, nhưng tôi vừa mới nhận thấy trong một chương trình cụ thể của tôi, tôi nhận được lỗi "memcpy không được khai báo trong phạm vi này" nếu tôi bao gồm "chuỗi", nhưng không phải nếu tôi bao gồm " string.h ".

Trước hết, tôi đã tự hỏi nguyên nhân cụ thể của điều này, nhưng cũng thường là sự khác biệt giữa hai. Đồng thời, nếu ai đó có thể giải thích sự khác biệt giữa bao gồm trong dấu ngoặc nhọn và những dấu ngoặc kép, nó sẽ được nhiều đánh giá cao.

+1

http: // stackoverflow.com/questions/301586/what-is-the-sự khác biệt-giữa-sử dụng-includefilename-và-includefilename-h –

Trả lời

22

<string> là tệp tiêu đề chuỗi thư viện chuẩn C++ chứa std::string và bạn bè của nó. <string.h> là một tiêu đề khác, từ thư viện chuẩn C, có chức năng để thao tác các chuỗi C (các chuỗi được kết thúc bằng null) và các hàm liên quan khác.

Hai loại này hoàn toàn khác và không liên quan. Trong C++ (như trong C), một tệp tiêu đề có thể có bất kỳ phần mở rộng nào. Các tiêu đề thư viện chuẩn C++ không có phần mở rộng; tiêu đề thư viện chuẩn C có phần mở rộng là .h. .hpp hoặc .hxx cũng phổ biến.

+2

Và cũng lưu ý rằng (tôi tin) mặc dù bao gồm chỉ thị là ' 'hoặc bất cứ điều gì, trình biên dịch isn' t cần thiết để thực sự gọi tập tin tương ứng 'chuỗi'. –

+0

@Mark B: Thật vậy; nó thậm chí không phải là một tập tin nào cả. Tôi không biết bất kỳ triển khai nào không sử dụng tệp có tên của tiêu đề; Tôi nghĩ rằng tôi muốn thấy rằng khá khó hiểu! –

+3

Mọi thứ James nói đều đúng. Nó cũng thú vị khi cập nhật tiêu chuẩn C++, tệp chuỗi C đã được đổi tên thành - trên thực tế tất cả thư viện chuẩn C, khi được thăng cấp lên thư viện chuẩn C++, đã được đổi tên bằng tiền tố 'c' và không '.h 'mở rộng, tức là, cstdlib, cstdio, vv Nó được cho là trường hợp các hàm C được chuyển vào không gian tên std. Nhiều trình biên dịch tiếp tục hỗ trợ , et al., Và không đặt thư viện chuẩn C trong std ::, nhưng tôi tin rằng chúng không bắt buộc phải làm nữa. – jwismar

2

Chúng là 2 tệp khác nhau và không liên quan gì đến nhau.

#include <string> đề cập đến C++ chuỗi STL thư viện chuẩn

#include <string.h> định nghĩa một số chức năng để thao tác chuỗi C và mảng.

Không có tiện ích mở rộng nào được giả định bao gồm.

Một số tệp tiêu đề không có .h được thêm vào chúng. Bạn thường thấy điều này với các tệp tiêu đề chứa mẫu.

0

Liên quan đến sự khác biệt giữa việc sử dụng dấu ngoặc nhọn và dấu ngoặc kép, tôi nghĩ rằng nó có liên quan đến thứ tự các tệp tiêu đề: nếu nó nằm giữa dấu ngoặc kép, trình biên dịch đầu tiên sẽ kiểm tra thư mục làm việc rất hữu ích trong trường hợp tiêu đề hệ thống, vì chúng không nằm trong cùng thư mục với trình biên dịch) trước khi kiểm tra thư mục tiêu đề hệ thống.

4

Tôi sẽ chỉ thêm vào, trong C++ có các tiêu đề C có sẵn ở dạng C truyền thống như string.h và chúng được sử dụng như #include <string.h>, nhưng cũng có các đối tác của chúng với tên bắt đầu bằng chữ "c" và không có tiện ích mở rộng - như cstring. Các tiêu đề này được sử dụng như tiêu đề C++ #include <cstring> và tên từ các tiêu đề đó nằm trong không gian tên std.

0

Giới thiệu về sự khác biệt giữa các dấu ngoặc nhọn và dấu ngoặc kép, lệnh đầu tiên hướng dẫn bộ tiền xử lý tìm kiếm tệp bao gồm đầu tiên dọc theo đường dẫn được chỉ định bởi tùy chọn trình biên dịch/I. Thứ hai cho bộ tiền xử lý tìm kiếm các tệp bao gồm trong cùng một thư mục của tệp chứa câu lệnh #include.

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