Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a Singleton in C?

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

I am aware that C isn't the first language you would use for a singleton.

like image 526
Liran Orevi Avatar asked Apr 29 '09 18:04

Liran Orevi


People also ask

What is a singleton in C?

Singleton in C++ Singleton is a creational design pattern, which ensures that only one object of its kind exists and provides a single point of access to it for any other code. Singleton has almost the same pros and cons as global variables. Although they're super-handy, they break the modularity of your code.

How do you declare a singleton class in C#?

Singleton Class allow for single allocations and instances of data. It has normal methods and you can call it using an instance. To prevent multiple instances of the class, the private constructor is used.

What is singleton with example?

Use the Singleton pattern when a class in your program should have just a single instance available to all clients; for example, a single database object shared by different parts of the program. The Singleton pattern disables all other means of creating objects of a class except for the special creation method.


1 Answers

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...

like image 57
dirkgently Avatar answered Oct 14 '22 08:10

dirkgently