Tại sao không nên extern "C"
được chỉ định cho hàm cần được định nghĩa là hàm C? Những gì có hiệu lực sẽ có trên trình biên dịch khi biên dịch các tập tin như là một nguồn C?Chúng tôi có thể sử dụng "C" bên ngoài trong tệp C mà không cần #ifdef __cplusplus không?
Nếu không có hiệu ứng trên trình biên dịch C, chúng tôi không thể chỉ định hàm trong tệp tiêu đề như dưới đây bằng cách xóa séc #ifdef __cplusplus
?
extern "C" {
int MyFunc();
}
An answer to another question nói rằng #ifdef
là cần thiết, nhưng tôi không hiểu tại sao:
Về # 2: __cplusplus sẽ được xác định cho bất kỳ đơn vị soạn thảo đang được chạy qua C++ biên dịch. Nói chung, điều đó có nghĩa là các tệp .cpp và bất kỳ tệp nào được bao gồm trong tệp .cpp đó. Cùng .h (hoặc .hh hoặc .hpp hoặc những gì bạn có) có thể được hiểu là C hoặc C++ vào các thời điểm khác nhau, nếu các đơn vị biên dịch khác nhau bao gồm chúng. Nếu bạn muốn các nguyên mẫu trong tệp .h tham chiếu đến tên biểu tượng C, thì chúng phải có
extern "C"
khi được hiểu là C++ và chúng không được cóextern "C"
khi được hiểu là C - do đó kiểm tra#ifdef __cplusplus
.
Cảm ơn. Tôi không biết đó là một cấu trúc C++. – Alexander