我有以下供应商为蓝牙低功耗(BLE)设备提供的代码。从下面的代码中,可以看到结构ble_lbs_t
是向前声明的。我试图理解为什么在这种情况下这是必要的。这是C以前版本的产物吗?这对平台有帮助吗?我正在使用最新版本的GNU ARM嵌入式工具链,该工具链使用ARM嵌入式GCC编译器。编译器的文档指出,它支持GCC 5的所有功能。
typedef struct ble_lbs_s ble_lbs_t;
typedef void (*ble_lbs_led_write_handler_t) (ble_lbs_t * p_lbs, uint8_t new_state);
typedef struct
{
ble_lbs_led_write_handler_t led_write_handler;
} ble_lbs_init_t;
struct ble_lbs_s
{
uint16_t service_handle;
ble_gatts_char_handles_t led_char_handles;
ble_gatts_char_handles_t button_char_handles;
uint8_t uuid_type;
uint16_t conn_handle;
ble_lbs_led_write_handler_t led_write_handler;
};
答案 0 :(得分:3)
在ble_lbs_s
结构中,led_write_handler
成员可能是这样写的:
void (*ble_lbs_led_write_handler_t) (struct ble_lbs_s * p_lbs, uint8_t new_state);
但是,ble_lbs_init_t
结构还具有使用相同功能签名的功能指针成员(led_write_handler
)。因此,作者选择将函数指针类型的typedef定义为ble_lbs_led_write_handler_t
,以便可以在两种结构中使用它,并且要求ble_lbs_s
结构在typedef可以使用之前先进行声明。>
答案 1 :(得分:2)
因为他们不想输入struct ble_lbs_s *
,因为ble_lbs_t *
较短。
您必须先使用typedef才能使用ble_lbs_t *
。我想不出任何其他原因。
答案 2 :(得分:2)
函数指针类型ble_lbs_led_write_handler_t
使用定义的类型ble_lbs_t
,因此需要进行前向声明。
typedef void (*ble_lbs_led_write_handler_t) (ble_lbs_t * p_lbs, uint8_t new_state);
功能指针也可以写在结构类型下方。在这种情况下,将不需要进行前向声明,但是如果不查看完整代码,就无法进一步评论。