co89757
11/25/2015 - 4:24 AM

Cool C tricks Trick#1 Mapping error numbers to error strings in a smart way Trick#2 Variable-length array Trick#3 Compile-time assert C++

Cool C tricks Trick#1 Mapping error numbers to error strings in a smart way Trick#2 Variable-length array Trick#3 Compile-time assert C++ static_assert() in C

/**
 * Mapping errors to error strings 
 */
 
/* Entries may not correspond to actual numbers. Some entries omitted. */
#define EINVAL 1
#define ENOMEM 2
#define EFAULT 3
/* ... */
#define E2BIG  7
#define EBUSY  8
/* ... */
#define ECHILD 12
/* ... */

// CREATE MAPPING TABLE ! 
char *err_strings[] = {
 	     [0] = "Success",
	[EINVAL] = "Invalid argument",
	[ENOMEM] = "Not enough memory",
	[EFAULT] = "Bad address",
	/* ... */
	[E2BIG ] = "Argument list too long",
	[EBUSY ] = "Device or resource busy",
	/* ... */
	[ECHILD] = "No child processes"
	/* ... */
};


/***
 * TRICK2: Variable Length array */
 
 typedef struct nstring{
   
   int len;
   char data[];
   
 } nstring_t;
 
 /*...*/
 nstring_t* ns = (nstring_t*) malloc(sizeof nstring_t + length);
 ns->len = length;
 
 /**
  * TRICK3 static assert 
  **/
  
  /* Force a compilation error if condition is false, but also produce a result
 * (of value 0 and type size_t), so it can be used e.g. in a structure
 * initializer (or wherever else comma expressions aren't permitted). */
/* Linux calls these BUILD_BUG_ON_ZERO/_NULL, which is rather misleading. */
#define STATIC_ZERO_ASSERT(condition) (sizeof(struct { int:-!(condition); })    )
#define STATIC_NULL_ASSERT(condition) ((void *)STATIC_ZERO_ASSERT(condition)    )

/* Force a compilation error if condition is false */
#define STATIC_ASSERT(condition) ((void)STATIC_ZERO_ASSERT(condition))