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" {
#endif
và ở 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,
__cplusplus
sẽ được xác định, vì vậy nó sẽ bọc mã bằngextern "C"
(và__cplusplus
sẽ không được xác định bên trong khối này). Vì vậy, khi nó bước vào Ch,__cplusplus
sẽ không được xác định và mã sẽ không được bọcextern "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ứ haiextern "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.