Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
11 years, 10 months ago.
How to wrap C functions into C++ class?
Hi all,
I'm wrapping some C functions into a C++ class, like mbed library. All functions in C are global functions, so should this class be a singleton, or could be a normal class? Even the functions are handling hardware? BTW, do you have any suggestion on how to wrap a C library into a C++ library?
Thanks a lot!
1 Answer
11 years, 10 months ago.
Hi Ye, In the mbed library we usually avoid wrapping C functions.
Two examples of that are:
As you can see, the only convention that you have to follow is declaring their prototype as extern "C"
if the file is compiled as C++:
#ifdef __cplusplus extern "C" { #endif [...] // Your prototypes here #ifdef __cplusplus } #endif
As discussed in another question there are small exceptions, if we think that a set of functions could become an object in the future.
In the mbed library we provide C++ wrappers for C objects.
By C object, I mean a C structure and a set of functions that take a reference to an instance of that structure as one of the parameters.
As an example take the GPIO C object for the LPC1768:
typedef struct { PinName pin; uint32_t mask; __IO uint32_t *reg_dir; __IO uint32_t *reg_set; __IO uint32_t *reg_clr; __I uint32_t *reg_in; } gpio_t; void gpio_init(gpio_t *obj, PinName pin, PinDirection direction); void gpio_write(gpio_t *obj, int value); int gpio_read(gpio_t *obj);
This gets wrapped in a C++ class like this:
class DigitalOut { public: DigitalOut(PinName pin) { gpio_init(&gpio, pin, PIN_OUTPUT); } void write(int value) { gpio_write(&gpio, value); } int read() { return gpio_read(&gpio); } protected: gpio_t gpio; };
HTH, Emilio
Why do you feel you have to do it? Why not just call C functions as-is?
posted by Igor Skochinsky 09 Jan 2013I think it will be easier for other people to use the classes. Like the mbed library.
posted by Ye Cheng 09 Jan 2013