为什么我在《MAV_drever.c》中定义extern uint8_t already_got_heartbeat = false时,报“use of undeclared identifier 'false'”的错误
时间: 2024-12-02 19:21:10 浏览: 22
在C语言中,`false`不是一个保留关键字,也不是标准库的一部分。当你在`MAV_drever.c`文件中使用`extern uint8_t already_got_heartbeat = false;`这行代码时,如果没有先在某个地方声明`false`,编译器会找不到这个标识符,因此会报"undeclared identifier 'false'"的错误。
解决这个问题的方法有几种:
1. **明确地初始化为0**:你可以将`false`替换为`0`,因为`uint8_t`默认就是0。所以改为`extern uint8_t already_got_heartbeat = 0;`。
2. **引入布尔类型**:在C99及以上标准中,你可以使用`stdbool.h`头文件来引入布尔类型`bool`并定义`true`和`false`。但在C语言的传统实现中,你需要自定义这些宏。
```c
#ifndef __cplusplus
#define bool int
#define true 1
#define false 0
#endif
```
3. **在包含的地方声明并初始化**:如果`already_got_heartbeat`只在当前文件中使用,你可以在其首次使用的上下文中声明并初始化它,而不是用`extern`提前声明。
确保你在使用`false`之前已经正确地导入了所需的类型或宏定义,这样编译器才能识别它。如果还是遇到问题,检查一下`<stdbool.h>`是否已正确包含,以及是否有适当的宏定义生效。
相关问题
为什么我在《MAV_drever.c》中定义extern uint8_t already_got_heartbeat = 0时,报“‘extern’ variable has an initializer”的错误
这个错误通常出现在C语言中,当你试图在一个外部链接(extern)声明变量时,如果该变量已经有了初始化值,并且是在它首次被声明的位置进行了初始化,编译器就会报出"‘extern’ variable has an initializer"的警告或错误。`extern`关键字表示变量将在其他文件中被定义,但在当前文件中声明。
在`MAV_drever.c`中,如果你已经给`already_got_heartbeat`变量分配了一个初始值0,而在头文件或者其他源文件中也给出了相同的声明并且尝试再次初始化,那么编译器会认为这是一个不必要的初始化,因为`extern`声明仅仅表明这个变量的存在,而不是它的值。
解决这个问题的一种方法是确保变量只在一处声明并初始化。如果确实需要一个静态初始化值,可以将初始化放在包含此变量的单个源文件的最开始,或者去掉`extern`声明,在当前文件内直接初始化,但如果其他地方也需要访问这个变量,则仍需保持`extern`声明。如果不需要初始化,只需保留`extern`即可:
```c
// 如果变量不需要初始化
extern uint8_t already_got_heartbeat;
// 或者在定义时移除初始化
uint8_t already_got_heartbeat; // 如果在某个源文件里
// 或者仅在其中一个文件中初始化
uint8_t already_got_heartbeat = 0;
```
// setup UAS and diag mav_uas.set_tgt(tgt_system_id, tgt_component_id); UAS_FCU(&mav_uas) = fcu_link; mav_uas.add_connection_change_handler(std::bind(&MavlinkDiag::set_connection_status, &fcu_link_diag, std::placeholders::_1)); mav_uas.add_connection_change_handler(std::bind(&MavRos::log_connect_change, this, std::placeholders::_1));
这段代码看起来是在设置一个MAVLink的链接,并且将该链接与一些处理程序关联。具体来说:
- `mav_uas.set_tgt(tgt_system_id, tgt_component_id);` 这行代码设置MAVLink连接的目标系统ID和组件ID。
- `UAS_FCU(&mav_uas) = fcu_link;` 这行代码设置MAVLink连接的通信方式(可能是串口、UDP、TCP等)。
- `mav_uas.add_connection_change_handler(std::bind(&MavlinkDiag::set_connection_status, &fcu_link_diag, std::placeholders::_1));` 这行代码将一个处理程序与MAVLink连接关联。当连接状态发生变化时,处理程序`MavlinkDiag::set_connection_status`将被调用,参数`_1`是连接状态。
- `mav_uas.add_connection_change_handler(std::bind(&MavRos::log_connect_change, this, std::placeholders::_1));` 这行代码将另一个处理程序与MAVLink连接关联。当连接状态发生变化时,处理程序`MavRos::log_connect_change`将被调用,参数`_1`是连接状态。
总体来说,这段代码的作用是建立MAVLink连接并且设置一些连接状态处理程序。
阅读全文