Bạn sử dụng extern "C"
để ngăn chặn việc mang tên trong các tệp tiêu đề và tệp đối tượng C++ cho các thư viện hoặc đối tượng đã được biên dịch mà không manglingling.
Ví dụ: giả sử bạn có thư viện widget
được biên dịch bằng trình biên dịch C để giao diện được xuất bản của nó không bị cắt xén.
Nếu bạn bao gồm tệp tiêu đề giống như mã của bạn, nó sẽ giả định tên là bị xáo trộn và các phiên bản bị xáo trộn là những gì bạn sẽ yêu cầu trình liên kết tìm kiếm.
Tuy nhiên, vì bạn sẽ yêu cầu một cái gì đó như [email protected]_float_charptr
và thư viện widget
sẽ chỉ xuất bản function
, bạn sẽ gặp sự cố.
Tuy nhiên, nếu bạn bao gồm nó với:
extern "C" {
#include "widget.h"
}
trình biên dịch của bạn sẽ biết rằng nó nên cố gắng sử dụng function
, phiên bản không đọc sai.
Đó là lý do tại sao, trong các tập tin tiêu đề cho C thứ có nghĩa là để được bao gồm trong chương trình C _or C++, bạn sẽ thấy những thứ như:
#ifdef __cplusplus
extern "C" {
#endif
// Everything here works for both C and C++ compilers.
#ifdef __cplusplus
}
#endif
Nếu bạn sử dụng một trình biên dịch C để bao gồm này, #ifdef
dòng sẽ làm cho các công cụ extern "C"
biến mất. Đối với trình biên dịch C++ (trong đó __cplusplus
được xác định), mọi thứ sẽ không bị xáo trộn.
Thay vì hack ' 'để tránh tên mangling, sử dụng tiêu đề ''. –
@AlexandreC .: hoàn toàn không phải là ý tưởng hay khi sử dụng tiêu đề ''. Một tiêu đề '' là * không * được bảo đảm để đặt định danh trong không gian tên chung, do đó phá vỡ mã dựa trên các định danh vùng tên chung khi mã đó được chuyển đến một trình biên dịch khác. Ngoài ra, một tiêu đề '' có thể và trong thực tế sẽ đặt định danh trong không gian tên chung, do đó trong lý thuyết cũng phá vỡ mã dựa trên một không gian tên không bị ô nhiễm toàn cầu. "Về lý thuyết" là quá mơ hồ mặc dù; ít nhất một thằng ngốc đã làm điều đó. Vì vậy, không sử dụng chúng. –
@ AlfP.Steinbach: Nếu bạn viết C++, hãy sử dụng ''. Nếu bạn viết C, hãy sử dụng '' và ** biên dịch mã của bạn bằng trình biên dịch C **.Trộn các ngôn ngữ là * không * một ý tưởng hay. –