Range-based for loop: Difference between revisions
Jump to navigation
Jump to search
Content added Content deleted
(new page) |
(clarify) |
||
Line 1: | Line 1: | ||
One of my pet peeves is the regular counting <tt>for</tt> loop in C where you have to repeat the variable name 3 times. This is error-prone in the case of nested loops, since the compiler has no way to know that you meant to increment <tt>j</tt> and not <tt>i</tt>. To prevent this kind of error, you can use a few helper macros that iterate over a range (forwards or backwards). |
One of my pet peeves is the regular counting <tt>for</tt> loop in C where you have to repeat the variable name 3 times. This is error-prone in the case of nested loops, since the compiler has no way to know that you meant to increment <tt>j</tt> and not <tt>i</tt>. To prevent this kind of error, you can use a few helper macros that iterate over a range (forwards or backwards). |
||
Definitions |
=== Definitions === |
||
<source lang="C"> |
<source lang="C"> |
||
Line 12: | Line 12: | ||
</source> |
</source> |
||
Note that <tt>typeof</tt> is a GNU/gcc extension, so this will not work on e.g. MSVC. |
This automatically deduces the type of the index variable, so that e.g. <tt>RANGE(i, -1, 1)</tt> will use <tt>int</tt>, while <tt>RANGE(i, 0U, 1U)</tt> will use <tt>unsigned long</tt>. Note that <tt>typeof</tt> is a GNU/gcc extension, so this will not work on e.g. MSVC. |
||
Usage |
=== Usage === |
||
<source lang="C"> |
<source lang="C"> |
Revision as of 19:52, 29 February 2020
One of my pet peeves is the regular counting for loop in C where you have to repeat the variable name 3 times. This is error-prone in the case of nested loops, since the compiler has no way to know that you meant to increment j and not i. To prevent this kind of error, you can use a few helper macros that iterate over a range (forwards or backwards).
Definitions
#define RANGE(var, low, high) \
(typeof(0 ? (low) : (high)) var = (low), _end = (high); var < _end; ++var)
// https://stackoverflow.com/a/5458283
#define REVERSE_RANGE(var, high, low) \
(typeof(0 ? (low) : (high)) var = (high), _end = (low); var-- > _end; )
This automatically deduces the type of the index variable, so that e.g. RANGE(i, -1, 1) will use int, while RANGE(i, 0U, 1U) will use unsigned long. Note that typeof is a GNU/gcc extension, so this will not work on e.g. MSVC.
Usage
for RANGE(i, -1, 5) {
printf("%d\n", i);
}