Even though C isn't designed to support object-orient programming, it is still possible to write OOP in C (or more accurately - implement OOP concepts using C features).
One common way is by using structs as "objects" - Data Abstraction in C (@jacwah)
Look at the struct from the Linux kernel source below (from include/linux/virtio.h).
* virtio_driver - operations for a virtio I/O driver
* @driver: underlying device driver (populate name and owner).
* @id_table: the ids serviced by this driver.
* @feature_table: an array of feature numbers supported by this driver.
* @feature_table_size: number of entries in the feature table array.
* @probe: the function to call when a device is found. Returns 0 or -errno.
* @remove: the function to call when a device is removed.
* @config_changed: optional function to call when the device configuration
* changes; may be called in interrupt context.
*/
struct virtio_driver {
struct device_driver driver;
const struct virtio_device_id *id_table;
const unsigned int *feature_table;
unsigned int feature_table_size;
int (*probe)(struct virtio_device *dev);
void (*scan)(struct virtio_device *dev);
void (*remove)(struct virtio_device *dev);
void (*config_changed)(struct virtio_device *dev);
#ifdef CONFIG_PM
int (*freeze)(struct virtio_device *dev);
int (*restore)(struct virtio_device *dev);
#endif
};
Another way is by naming conventions & correct usage of modules - http://rodrigomendez.me/writing-object-oriented-code-in-c/
Also look at (Referencing a book about the subject) -
How would one write object-oriented code in C?