On 31/01/2022 16:54, Hirrolot via Gcc-help wrote: > I have a macro that expands to a for-loop. It is used as follows: > > MACRO(...) { > // User code > } > > The for-loop is used to open a new scope with a new variable; thus, > `MACRO(...) { ... }` would be a proper C statement. The loop itself is > executed only once. > > The problem is that if a user uses `break` or `continue` like this: > > while (i < 10) { > MACRO(...) { > break; > // User code... > } > } > > Then that `break` will apply to the for-loop generated by `MACRO`, not > to the outer while-loop. The same holds for `continue`. This is > unexpected behaviour, and I would like to prohibit the use of the > `break`/`continue` statements in a user statement placed after > `MACRO`. Ideally, this should somehow trigger a compilation > error/warning. > > It should be clarified that `MACRO` is not of a loop itself: it is not > a for-each macro or something like this; using that for-loop is just > an implementation detail. I would be also happy with getting rid of > that for-loop but I have no idea how. If I just generate a variable > like this: > > #define MACRO(...) int x; /* Some other stuff */ > > Then `MACRO(...) { ... }` will no longer be a single C statement. > Moreover, two occurrences of `MACRO` calls in a single scope will > result in a compilation error, which is also quite unfortunate. > > Is it possible to trigger a compilation warning/error for > `break`/`continue` with GCC? > The only thing I can think of is: #define break DON'T USE BREAK HERE #define continue DON'T USE CONTINUE HERE That should cause a compilation error if "break" or "continue" are used. Of course, you need to use the #define and a matching #undef in the places MACRO is used. And it's undefined behaviour to use keywords as macro names, so other bad things might happen. A far better idea would be to explain what you are trying to achieve with your MACRO, and show your current definition. Then people could perhaps give you useful advice! David