82#define _inhibit_name(name) _inhibit_##name
89#define inhibitDeclare(name) enum { _inhibit_name(name) = 0 }
101#if (!defined(_MSC_VER) || _MSC_VER > 1930) && !defined(__cplusplus)
102#define inhibitCheck(name) \
103 switch (tokstring(_inhibit_name(name))[_inhibit_name(name)]) \
106#define inhibitCheck(name)
109#define _inhibitDisallow(name) \
110 _blkCond(const int* const _inhibit_name(name) = 0, !_inhibit_name(name))
128#define inhibitDisallow(name) _blkStart _inhibitDisallow(name)
130#define _inhibitAllow(name) _blkCond(const int _inhibit_name(name) = 0, !_inhibit_name(name))
140#define inhibitAllow(name) _blkStart _inhibitAllow(name)
147#if DEBUG_LEVEL >= 1 && !defined(_PREFAST_)
149#define _inhibitReturn _inhibitDisallow(RETURN)
150#define _allowReturn _inhibitAllow(RETURN)
151#define return inhibitCheck(RETURN) return
153#define _inhibitReturn _blkStart
154#define _allowReturn _blkStart
159#define _BLK_VAR _block_done
163#define _blkDef(before) for (tokeval(before); _BLK_VAR; _BLK_VAR = 0)
164#define _blkCond(before, cond) for (tokeval(before); (cond) && _BLK_VAR; _BLK_VAR = 0)
165#define _blkFull(before, cond, ...) \
166 for (tokeval(before); (cond) && _BLK_VAR; (__VA_ARGS__), _BLK_VAR = 0)
171#define _blkStart _blkDef(bool _BLK_VAR = 1)
172#define _blkBefore(...) for (tokeval(__VA_ARGS__); _BLK_VAR; _BLK_VAR = 0)
173#define _blkBeforeAfter(before, ...) _inhibitReturn _blkFull(tokeval(before), true, __VA_ARGS__)
174#define _blkAfter(...) _blkBeforeAfter(, (__VA_ARGS__))
177#define _blkEnd _blkBefore()
181#define _blkDefRecursive(type, name, ...) \
182 _blkDef(type tokcat2(_block_decl_, name) = tokeval(__VA_ARGS__)) \
183 _blkCond(type name = tokcat2(_block_decl_, name), ((void)name, true))
230#define blkWrap(before, ...) _blkStart _blkBeforeAfter(tokeval(before), __VA_ARGS__) _blkEnd
Compiler and platform detection macros.
Runtime type system and type descriptor infrastructure.
Token pasting and stringification macros.