Tôi đang làm việc trên một dự án có nhiều mã C kế thừa . Chúng tôi đã bắt đầu viết bằng C ++, với mục đích cuối cùng là chuyển đổi mã kế thừa. Tôi hơi bối rối về cách C và C ++ tương tác. Tôi hiểu rằng bằng cách gói mã C bằng extern "C"trình biên dịch C ++ sẽ không xáo trộn tên của mã C , nhưng tôi không hoàn toàn chắc chắn làm thế nào để thực hiện điều này.
Vì vậy, ở đầu mỗi tệp tiêu đề C (sau các bộ bảo vệ bao gồm), chúng tôi có
#ifdef __cplusplus
extern "C" {
#endifvà ở phía dưới, chúng tôi viết
#ifdef __cplusplus
}
#endifỞ giữa hai, chúng ta có tất cả các nguyên mẫu bao gồm, typedefs và hàm. Tôi có một vài câu hỏi, để xem liệu tôi có hiểu đúng về điều này không:
- Nếu tôi có tệp C ++ A.hh bao gồm tệp tiêu đề C Bh, bao gồm một tệp tiêu đề C khác Ch, thì nó hoạt động như thế nào? Tôi nghĩ rằng khi trình biên dịch bước vào Bh, - __cplusplussẽ được xác định, vì vậy nó sẽ bọc mã bằng- extern "C"(và- __cplusplussẽ không được xác định bên trong khối này). Vì vậy, khi nó bước vào Ch,- __cplusplussẽ không được xác định và mã sẽ không được bọc- extern "C". Điều này có đúng không?
- Có điều gì sai với việc gói một đoạn mã với - extern "C" { extern "C" { .. } }? Người thứ hai- extern "C"sẽ làm gì?
- Chúng tôi không đặt trình bao bọc này xung quanh các tệp .c, chỉ các tệp .h. Vậy, điều gì xảy ra nếu một chức năng không có nguyên mẫu? Trình biên dịch có nghĩ rằng đó là một hàm C ++ không? 
- Chúng tôi cũng đang sử dụng một số mã của bên thứ ba được viết bằng C và không có loại trình bao bọc này. Bất cứ khi nào tôi bao gồm một tiêu đề từ thư viện đó, tôi đã đặt - extern "C"xung quanh #incoide. Đây có phải là cách đúng đắn để đối phó với điều đó?
- Cuối cùng, đây có phải là một ý tưởng tốt? Có điều gì khác chúng ta nên làm không? Chúng tôi sẽ kết hợp C và C ++ trong tương lai gần và tôi muốn chắc chắn rằng chúng tôi sẽ đảm bảo tất cả các cơ sở của chúng tôi.