Search code examples
cdesign-patternssingleton

How to create a Singleton in C?


What's the best way to create a singleton in C? A concurrent solution would be nice.


Solution

  • First, C is not suitable for OO programming. You'd be fighting all the way if you do. Secondly, singletons are just static variables with some encapsulation. So you can use a static global variable. However, global variables typically have far too many ills associated with them. You could otherwise use a function local static variable, like this:

     int *SingletonInt() {
         static int instance = 42;
         return &instance;
     }
    

    or a smarter macro:

    #define SINGLETON(t, inst, init) t* Singleton_##t() { \
                     static t inst = init;               \
                     return &inst;                       \
                    }
    
    #include <stdio.h>  
    
    /* actual definition */
    SINGLETON(float, finst, 4.2);
    
    int main() {
        printf("%f\n", *(Singleton_float()));
        return 0;
    }
    

    And finally, remember, that singletons are mostly abused. It is difficult to get them right, especially under multi-threaded environments...