2013-07-03 38 views
14

Chỉ cần một câu hỏi nhỏ: C++ có thể sử dụng các tệp tiêu đề C trong một chương trình không?Cách sử dụng mã C trong C++

Đây có thể là một câu hỏi kỳ lạ, về cơ bản tôi cần sử dụng mã nguồn từ chương trình khác (được tạo bằng ngôn ngữ C) trong một C++. Có bất kỳ sự khác biệt nào giữa cả hai tệp tiêu đề nói chung không? Có thể nếu tôi thay đổi một số thư viện ... Tôi hy vọng bạn có thể giúp tôi.

+1

Phần này của C++ faq khi trộn C và C++ có thể hữu ích: http://www.parashift.com/c++-faq/mixing-c-and-cpp.html –

+0

Cập nhật liên kết cho C++ FAQ: https://isocpp.org/wiki/faq/mixing-c-and-cpp – Phlucious

Trả lời

25

Có, bạn có thể bao gồm tiêu đề C trong mã C++. Việc thêm thông tin này là bình thường:

#ifdef __cplusplus 
extern "C" 
{ 
#endif 

// C header here 

#ifdef __cplusplus 
} 
#endif 

để trình biên dịch C++ biết rằng khai báo chức năng, v.v ... nên được coi là C chứ không phải C++.

+0

Woah, tôi không biết điều đó. Rất tuyệt vời, cảm ơn! – SadSeven

+10

Lưu ý rằng nó không có nghĩa là "biên dịch mã này dưới dạng C". Nó chỉ có nghĩa là tất cả các ký hiệu giữa các dấu ngoặc có liên kết C (có nghĩa là, trong số những thứ khác, không phải để thực hiện tên C++ * mangling * trên chúng). – Medinoc

6

Có, nhưng bạn cần phải nói với các trình biên dịch C++ mà tờ khai từ tiêu đề là C:

extern "C" { 
#include "c-header.h" 
} 

Nhiều header C đã bao gồm những đã có, được bọc trong #if defined __cplusplus. Điều đó được cho là hơi lạ (cú pháp C++ trong tiêu đề C) nhưng nó thường được thực hiện để thuận tiện.

11

Nếu bạn đang biên dịch mã C với nhau, như một phần của dự án, với mã C++, bạn chỉ cần bao gồm các tệp tiêu đề như bình thường, và sử dụng chế độ biên dịch C++ để biên dịch mã. một số mã C sẽ không biên dịch "sạch" với trình biên dịch C++ (ví dụ: sử dụng malloc sẽ cần truyền).

Nếu mặt khác, bạn có thư viện hoặc một số mã khác không phải là một phần của dự án, bạn cần đảm bảo tiêu đề được đánh dấu là extern "C", nếu không thì quy ước đặt tên C++ cho tên được biên dịch các hàm sẽ được áp dụng, không phù hợp với quy ước đặt tên được trình biên dịch C sử dụng.

Có hai lựa chọn ở đây, hoặc là bạn chỉnh sửa các tập tin tiêu đề riêng của mình, thêm

#ifdef __cplusplus 
extern "C" { 
#endif 

... original content of headerfile goes here. 

#ifdef __cplusplus 
} 
#endif 

Hoặc, nếu bạn không có khả năng để chỉnh sửa những tiêu đề, bạn có thể sử dụng hình thức này:

#ifdef __cplusplus 
extern "C" { 
#endif 
#include <c_header.h>" 
#ifdef __cplusplus 
} 
#endif