Metalang99
1.13.3
Full-blown preprocessor metaprogramming
stmt.h
Go to the documentation of this file.
1
33
#ifndef ML99_STMT_H
34
#define ML99_STMT_H
35
36
#include <
metalang99/util.h
>
37
57
#define ML99_INTRODUCE_VAR_TO_STMT(...) ML99_PRIV_INTRODUCE_VAR_TO_STMT_INNER(__VA_ARGS__)
58
84
#define ML99_INTRODUCE_NON_NULL_PTR_TO_STMT(ty, name, init) \
85
ML99_PRIV_SHADOWS(for (ty *name = (init); name != 0; name = 0))
86
106
#define ML99_CHAIN_EXPR_STMT(expr) \
107
ML99_PRIV_SHADOWS(for (int ml99_priv_expr_stmt_break = ((expr), 0); \
108
ml99_priv_expr_stmt_break != 1; \
109
ml99_priv_expr_stmt_break = 1))
110
114
#define ML99_CHAIN_EXPR_STMT_AFTER(expr) \
115
ML99_PRIV_SHADOWS(for (int ml99_priv_expr_stmt_after_break = 0; \
116
ml99_priv_expr_stmt_after_break != 1; \
117
((expr), ml99_priv_expr_stmt_after_break = 1)))
118
140
#define ML99_SUPPRESS_UNUSED_BEFORE_STMT(expr) ML99_CHAIN_EXPR_STMT((void)expr)
141
142
#ifndef DOXYGEN_IGNORE
143
144
// See <https://github.com/Hirrolot/metalang99/issues/25>.
145
#ifdef __cplusplus
146
#define ML99_PRIV_INTRODUCE_VAR_TO_STMT_INNER(...) \
147
ML99_PRIV_SHADOWS(for (__VA_ARGS__, \
148
*ml99_priv_break_arr[] = {0, 0}, \
149
**ml99_priv_break = &ml99_priv_break_arr[0]; \
150
ml99_priv_break == &ml99_priv_break_arr[0]; \
151
ml99_priv_break++))
152
#else
153
#define ML99_PRIV_INTRODUCE_VAR_TO_STMT_INNER(...) \
154
ML99_PRIV_SHADOWS(for (__VA_ARGS__, *ml99_priv_break = (void *)0; \
155
ml99_priv_break != (void *)1; \
156
ml99_priv_break = (void *)1))
157
#endif
158
159
#define ML99_PRIV_SHADOWS(...) \
160
ML99_CLANG_PRAGMA("clang diagnostic push"
) \
161
ML99_CLANG_PRAGMA("clang diagnostic ignored \"-Wshadow\"") \
162
__VA_ARGS__ \
163
ML99_CLANG_PRAGMA("clang diagnostic pop")
164
165
#endif
// DOXYGEN_IGNORE
166
167
#endif
// ML99_STMT_H
util.h
Utilitary stuff.
include
metalang99
stmt.h
Generated by
1.9.4