第二版 转换连接指定-Learning ROS for Robotics Programming
9.5 转换连接指定
如果你需要在 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 f1(int a);
void f2(char b);
}
大多数 C++ 编译器开发商在他们的头文件中已经处理了转换连接指定,包括 C 和 C++,所以你不用太担心这方面的问题。虽然标准的 C++ 只支持“C”和“C++”两种连接转换指定,但同样的方法可以用来支持其他语言。
你可以在这篇文章中了解更多关于 extern
关键字的详细信息。它解释了 extern
的各种用法,帮助你更好地理解这个关键字的威力。
9.6 小结
static 关键字总是让人头疼,因为它有时控制存储分配,有时控制名字的可见性和连接。随着 C++ 名字空间的引入,我们有了更好的、更灵活的方法来控制大项目中名字的增长。在类的内部使用 static 是在全程序中控制名字的另一种方法。这些名字不会与全局名冲突,并且可见性和访问也限制在程序内部,使得代码维护更轻松。
对于 static
关键字的更多理解,你可以查看这篇文章,它深入解析了 static
和 extern
的关键区别及其用法。
9.7 练习
- 创建一个带整型数组的类。在类内部用未标识的枚举变量来设置数组的长度。增加一个功能来访问和修改数组的元素。
下载地址
用户评论