为什么要提前申报?

时间:2018-12-04 04:00:44

标签: c struct

我有以下供应商为蓝牙低功耗(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;   
};

3 个答案:

答案 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);

功能指针也可以写在结构类型下方。在这种情况下,将不需要进行前向声明,但是如果不查看完整代码,就无法进一步评论。