01 简介

看示例代码的时候,发现总是出现rcl_ret_t rc,或是rc!=RCL_RET_OK,或是各种rc=...

赋值rc并比较 是为了检查return code。虽然使用 rc 只是一种习惯,并不是必要的,但是这可以在代码报错时帮助我们及时定位bug。

多数情况下,这是一个好习惯,但是别滥用~

02 示例

2.1 声明

数据类型rcl_ret_t,如下:

1
rcl_ret_t rc;

2.2 场景1:初始化

通常情况下,main函数起首定义四件套,rc、allocator、support、node

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main(int argc, const char * argv[])
{
rcl_ret_t rc;

rcl_allocator_t allocator = rcl_get_default_allocator();
rclc_support_t support;

// create init_options
rc = rclc_support_init(&support, argc, argv, &allocator);
if (rc != RCL_RET_OK) {
printf("Error rclc_support_init.\n");
return -1;
}

// create rcl_node
rcl_node_t my_node = rcl_get_zero_initialized_node();
rc = rclc_node_init_default(&my_node, "node_0", "executor_examples", &support);
if (rc != RCL_RET_OK) {
printf("Error in rclc_node_init_default\n");
return -1;
}

/* MORE CODE */
}

2.3 场景2:清除过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main(int argc, const char * argv[])
{
/* MORE CODE */

// clean up
rc = rclc_executor_fini(&executor_pub);
rc += rclc_executor_fini(&executor_sub);
rc += rcl_publisher_fini(&my_string_pub, &my_node);
rc += rcl_publisher_fini(&my_int_pub, &my_node);
rc += rcl_timer_fini(&my_string_timer);
rc += rcl_timer_fini(&my_int_timer);
rc += rcl_subscription_fini(&my_string_sub, &my_node);
rc += rcl_subscription_fini(&my_int_sub, &my_node);
rc += rcl_node_fini(&my_node);
rc += rclc_support_fini(&support);

std_msgs__msg__Int32__fini(&int_pub_msg);
std_msgs__msg__String__fini(&string_sub_msg);
std_msgs__msg__Int32__fini(&int_sub_msg);

if (rc != RCL_RET_OK) {
printf("Error while cleaning up!\n");
return -1;
}