Всегда лучше передать переменную цикла в макрос.
Блок - макрос имеет определенные проблемы с оптимизацией. Все компиляторы не гарантируют оптимизированный код obj для переменных «область видимости блока».
Например, следующий код, когда он скомпилирован без каких-либо опций оптимизации для gcc, печатает два отдельных адреса для & i. И один и тот же код при компиляции с опцией -O2 напечатает один и тот же адрес в обоих блоках.
{
int i;
printf("address of i in first block is %u\n", &i);
}
{
int i;
printf("address of i in sec block is %u\n", &i);
}
Присвоение имен языковым конструкциям делает код более читабельным.
Мне нравится ваша идея, если вы сформулируете ее следующим образом.
#define GREEN 1
#define YELLOW 2
#define RED 3
# define NUM_COLORS 3
#define COLOR_ITER (color,i) \
for(i=GREEN, color = colors[i]; \
i < NUM_COLORS; \
color = colors[++i])
int colors[3] = {GREEN, YELLOW, RED};
int
fun () {
int j;
color_t clr;
COLOR_ITER(clr, j) {
paint(clr);
}
}
Здесь, независимо от того, как он написан, макрос COLOR_ITER по своему названию подразумевает, что вы циклически выполняете все доступные цвета и делаете «что-то» для каждого цвета. И это очень простой в использовании макрос.
И ваш вопрос
Могу ли я использовать пропроцессор для замены моего исходного кода своим личным включением в форматированный источник без включения?
Как все объяснили, препроцессор не поможет вам в этом случае.
Вы можете использовать команды редактора для автоматического форматирования кода при его вводе.