extern "C" ระบุ linkage แบบ C ป้องกัน name mangling ของ C++ ชื่อฟังก์ชันจะคงเดิมใน object file
ปัญหา Name Mangling
C++ รองรับ overloading → compiler เข้ารหัสชื่อฟังก์ชัน (mangle) รวม parameter types เช่น func(int) → _Z4funci ต่างคอมไพเลอร์ต่างเข้ารหัส
การใช้ extern "C"
// เรียก C library จาก C++
extern "C" {
#include // หรือ header C อื่นๆ
// หรือประกาศเอง
int printf(const char*, ...);
}
int main() {
printf("Hello from C!\n"); // ไม่มี name mangling
}
กรณีใช้งานทั่วไป
- เรียก C libraries จาก C++ code
- เขียน C++ functions ให้ C code เรียก (callback, plugins)
- Header files ที่ share ระหว่าง C และ C++
Header แบบ Cross-language
// mylib.h
#ifdef __cplusplus
extern "C" {
#endif
void my_c_function(int);
#ifdef __cplusplus
}
#endif
หมายเหตุ: extern "C" ใช้ได้เฉพาะ namespace scope ไม่ได้ใช้กับ class members