它们是 C 语言中最有用的东西之一!它们允许您制作更多模块化的软件。
回调
例如,
typedef void (*serial_data_callback)(int length, unsigned char* data);
void serial_port_data_received(serial_data_callback callback)
{
on_data_received = callback;
}
void data_received(int length, unsigned char* data)
{
if(on_data_received != NULL) on_data_received(length, data);
}
这意味着在您的代码中您可以使用通用串行例程.....那么您可能有两个使用串行、modbus 和终端的东西
serial_port_data_received(modbus_handle_data);
serial_port_data_received(terminal_handle_data);
他们可以实现回调函数并做适当的事情。
它们允许面向对象的 C 代码。这是一种创建“接口”的简单方法,然后每种具体类型可能会实现不同的东西。为此,通常您将拥有一个具有函数指针的结构,然后是实现每个函数指针的函数,以及一个创建函数,该函数将使用正确的函数设置函数指针。
typedef struct
{
void (*send)(int length, unsigned char* data);
} connection_t;
void connection_send(connection_t* self, int length, unsigned char* data)
{
if(self->send != NULL) self->send(length, data);
}
void serial_send(int length, unsigned char* data)
{
// send
}
void tcp_send(int length, unsgined char* data)
{
// send
}
void create_serial_connection(connection_t* connection)
{
connection->send = serial_send;
}
然后其他代码可以使用 connection_t 而无需关心它是通过串行、tcp 还是您能想到的任何其他方式。