Từ C++ 11 dự thảo, 7.5 (para 1.):Extern "C" có hoạt động riêng biệt không?
Hai loại chức năng với ngôn ngữ khác nhau mối liên kết nhiều loại khác nhau ngay cả khi họ là khác giống hệt nhau.
Vì vậy, tôi có thể làm quá tải dựa trên mối liên hệ ngôn ngữ:
extern "C" typedef void (*c_function)();
typedef void (*cpp_function)();
void call_fun(c_function f)
{
}
void call_fun(cpp_function f)
{
}
extern "C" void my_c()
{
}
void my_cpp()
{
}
int main()
{
call_fun(my_c);
call_fun(my_cpp);
}
Nhưng, với GCC 4.7.1 mẫu mã này sẽ cho các thông báo lỗi:
test.cpp: In function 'void call_fun(cpp_function)':
test.cpp:7:6: error: redefinition of 'void call_fun(cpp_function)'
test.cpp:4:6: error: 'void call_fun(c_function)' previously defined here
Và với Clang ++:
test.cpp:7:6: error: redefinition of 'call_fun'
void call_fun(cpp_function f)
^
test.cpp:4:6: note: previous definition is here
void call_fun(c_function f)
^
Bây giờ, đặt câu hỏi:
Tôi có hiểu đúng tiêu chuẩn không? Mã này có hợp lệ không?
Có ai biết nếu đây là lỗi trong trình biên dịch hoặc nếu chúng cố tình thực hiện theo cách đó cho mục đích tương thích?
Chỉ cần cho các hồ sơ: tiêu chuẩn C++ 03 có chính xác cùng một câu trong đoạn cùng, vì vậy đây không phải là câu hỏi về tính năng C++ 11 chưa được hỗ trợ bởi trình biên dịch. – Gorpik
Xem http://stackoverflow.com/a/10643935/1463922. Hãy chắc chắn rằng các quy ước gọi của C và C++ phù hợp. – PiotrNycz