====== C ======
====== printf format check ======
extern int my_printf (void *my_object, const char *my_format, ...) __attribute__ ((format (printf, 2, 3)));
====== volatile ======
* **volatile uint8_t *foo;** - tells the compiler the memory being pointed to is volatile
* **uint8_t volatile * p_ledreg = 0x10000000;** - In the above code, the variable ''p_legreg'' is a pointer to a volatile 8-bit unsigned register located at address 0x10000000.
* **uint8_t * volatile foo;** - mark the pointer itself as volatile
====== compile time asserts ======
aka STATIC_ASSERT
* Can be used in local block without compiler warning:
* Cannot be used outside functions (i.e. header)
#define COMPILE_TIME_ASSERT(pred) switch(0){case 0:case pred:;} // NOLINT
* can be used in headers
* compiler show warnings if used locally (typedef not used)
#ifndef CTASSERT /* Allow lint to override */
#define CTASSERT(x) _CTASSERT(x, __LINE__)
#define _CTASSERT(x, y) __CTASSERT(x, y)
#define __CTASSERT(x, y) typedef char __assert ## y[(x) ? 1 : -1]
#endif
======= MAX_VALUE =======
#define IS_TYPE_SIGNED(a) ((a-1) < 0)
#define MAX_VALUE_UNSIGNED(a) (((unsigned long long)1 << \
(sizeof(a) * CHAR_BIT)) - 1)
#define MAX_VALUE_SIGNED(a) (MAX_VALUE_UNSIGNED(a) >> 1)
#define MAX_VALUE(a) (IS_TYPE_SIGNED(a) ? \
MAX_VALUE_SIGNED(a) : MAX_VALUE_UNSIGNED(a))
====== sizeof ======
#define member_size(type, member) sizeof(((type *)0)->member)