一、輸出「??」
項目調試一個節點,打印 ROS 信息時發現設置的節點名稱都是問號:
ROS_INFO("[%s]: camera_extrinsic_mat", kNodeName);
看了下代碼發現是自己把節點名稱設置爲 const,但是沒有正確初始化 const
變量,導致輸出了「??」,C++ 語法都忘記了,太菜了,以下是第一種初始化 const 的方法:
// 1. 先在類中定義
private:
const std::string kNodeName;
// 2. 構造函數初始化列表後初始化
ClassName(): kNodeName("node_name")
第二種方法是加上 static 關鍵字:
// 1. 在類中定義靜態 const 變量
private:
static const std::string kNodeName;
// 2. 在類外進行 const 初始化
const std::string ClassName::kNodeName = "node_name";
我用的第二種方式,因爲這樣的 const 看起來比較直觀,在構造函數初始化列表中賦值不容易被看到,以下是我修改後的代碼:
// 1. lidar_camera_fusion.h
private:
static const std::string kNodeName;
// 2. lidar_camera_fusion.cpp
const std::string LidarCameraFusion::kNodeName = "lidar_camera_fusion";
// 3. ROS_INFO
ROS_INFO("[%s]: camera_extrinsic_mat", kNodeName);
總結下 const 變量在類中的用法:
- 構造函數參數初始化列表中初始化 const 變量
- 將 const 變量聲明爲 static 類型,然後在類的外部初始化
二、輸出亂碼
正確初始化 const 變量後,發現 INFO 又輸出亂碼:
找了下資料發現是因爲 ROS_INFO
不能直接輸出 std::string
,需要轉成 c_str
:
// 3. ROS_INFO
ROS_INFO("[%s]: camera_extrinsic_mat", kNodeName.c_str());
第二個亂碼的原因是因爲把 %s
錯寫成大寫的 %S
了,改回來即可:
// 3. 錯寫成大寫的 %S 了
ROS_INFO("[%S]: camera_extrinsic_mat", kNodeName.c_str());