如果在C++中需要使用C库,那该怎么办呢?举个例子,如果我们有一个C函数声明如下:
float f(int a, char b);
C++编译器会将这个名字变成像_f_int
之类的东西,以支持函数重载和类型安全连接。然而,C编译器编译的库通常不会做这样的转换,所以它的内部名可能是_f
。这样,连接器将无法解决我们在C++中对f()
的调用。
怎么办呢?C++提供了一种连接转换指定,通过重载extern
关键字来实现。我们可以使用如下方式声明这个函数:
extern "C" float f(int a, char b);
这就告诉编译器f()
是C连接类型,这样就不会转换函数名。标准的连接类型指定符有“C”和“C++”两种,但编译器开发商可以选择用同样的方法支持其他语言。如果有一组转换连接的声明,可以把它们放在花括号内或者在头文件中:
extern "C" {
float f(int a, char b);
int g(double x);
}
多数C++编译器开发商在他们的头文件中已经处理了转换连接指定,包括C和C++,所以我们不用担心它们。
你是否还觉得extern和static有些困惑?不妨看看这些资源,它们对相关概念有更详细的解释和实例:C语言中的static和extern、C++C中的extern和static、C++语言中的static和extern。这些文章不仅能帮助你理解这些关键字的使用,还能让你在实际编程中游刃有余。
至于练习,你可以尝试创建一个带整型数组的类。在类内部用未标识的枚举变量来设置数组的长度。这个练习不仅能让你更好地理解C++中的数组和类的关系,还能让你对枚举变量有更深刻的认识。更多关于const、extern、static、volatile等关键字的用法,可以参考这篇详细解析的文章:const extern static volatile的使用。
暂无评论