C

C 是 C++ 的祖先语言,至今仍是底层系统编程的通用语言:操作系统内核、设备驱动、传感器固件以及许多嵌入式运行时都是用 C 编写的。你很少会用 C 编写一整套 SLAM 系统,但你会不断地阅读并与 C 代码打交道。

需要学习的内容

#include <stdlib.h>

typedef struct { float x, y, z; } Point3;

Point3* cloud_alloc(size_t n) {
    return (Point3*)malloc(n * sizeof(Point3));  /* must free() later */
}

/* Callback registration, the universal sensor-SDK pattern */
typedef void (*frame_cb)(const unsigned char* data, int w, int h, void* user);
void sensor_set_callback(frame_cb cb, void* user_data);

连接 C 与 C++

C++ 编译器会对函数名进行name mangling(名称修饰)以编码类型信息,而 C 不会。extern "C" 告诉 C++ 编译器使用 C 语言的链接方式,从而让两个世界能够互相调用:

extern "C" {
#include "vendor_camera_sdk.h"   // C header from the sensor vendor
}

// C++ wrapper: RAII around the C API's open/close pair
class Camera {
public:
    Camera()  { handle_ = vendor_cam_open(); }
    ~Camera() { vendor_cam_close(handle_); }
private:
    vendor_cam_handle* handle_;
};

这种包装模式 —— 内部是 C API,外部是 RAII —— 正是良好设计的 SLAM 代码库用来约束 C 接口不安全性的方式。

C 在 SLAM 工作中出现的场景

常见陷阱

对SLAM的意义

实时 SLAM 与硬件紧密相连,而你的算法与传感器、操作系统、加速器之间的边界几乎总是一个 C 接口。能够流畅地阅读 C 代码 —— 并理解手动内存管理 —— 会让你成为更出色的 C++ 程序员,并让你能够调试从驱动回调到光束法平差的完整技术栈。对大多数学习者而言,可以把 C 当作 C++ 学习的伴随内容,而不必单独深入钻研。

相关条目