1. 首页
  2. 编程语言
  3. C++ 
  4. 第二版 转换连接指定-Learning ROS for Robotics Programming

第二版 转换连接指定-Learning ROS for Robotics Programming

上传者: 2024-07-23 22:39:03上传 PDF文件 14.32MB 热度 10次

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 关键字的更多理解,你可以查看这篇文章,它深入解析了 staticextern 的关键区别及其用法。


9.7 练习

  1. 创建一个带整型数组的类。在类内部用未标识的枚举变量来设置数组的长度。增加一个功能来访问和修改数组的元素。

下载地址
用户评论