简述在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明 ?
参考答案:
在C++程序中调用由C编译器编译的函数时,需要使用extern "C"
声明,主要原因有以下两个:
- 名称修饰(Name Mangling):C++支持函数重载,这是C语言所不具备的特性。为了实现函数重载,C++编译器会对函数名进行一种称为“名称修饰(Name Mangling)”的处理,即在函数名后面添加一些信息,以便区分同名但参数不同的函数。然而,C语言并不进行这种名称修饰,所以由C编译器编译的函数名保持原样。如果C++代码直接调用C函数,由于名称修饰的存在,C++编译器可能无法找到正确的函数名,从而导致链接错误。通过使用
extern "C"
声明,可以告诉C++编译器,这些函数是由C编译器编译的,不应该进行名称修饰。 - 类型检查:C++是一种强类型语言,而C语言则相对宽松。在某些情况下,C++编译器可能会对C函数的参数类型进行更严格的检查,这可能导致类型不匹配的错误。使用
extern "C"
声明可以告诉C++编译器,这些函数的类型检查应该遵循C语言的规则,而不是C++的规则。
因此,当在C++程序中调用由C编译器编译的函数时,需要使用extern "C"
声明来确保正确的链接和类型检查。