M­­ar­­­­k Ответов: 2

Как увеличить переменную при использовании макросов препроцессора C ?


Скажем, я хочу написать простой цикл, который идет от x к y, и каждый раз, когда этот цикл выполняется, x увеличивается на 1.

Это код, который я пробовал.

#define LOOP(x,y) 	while(x<=y)\
					{\
						printf("%d", x);\
						x++;\
					}


Но это дает ошибку в строке x++ говоря "[Ошибка] lvalue требуется в качестве операнда инкремента".

Та же ошибка появляется, даже если Я заменил x++ на ++x, x=x+1, x+=1. Как правильно увеличивать переменную при написании функции с помощью макросов?

Что я уже пробовал:

#define LOOP(x,y) 	while(x<=y)\
					{\
						printf("%d", x);\
						x++;\
					}


<pre>#define LOOP(x,y) 	while(x<=y)\
					{\
						printf("%d", x);\
						++x;\
					}


<pre>#define LOOP(x,y) 	while(x<=y)\
					{\
						printf("%d", x);\
						x=x+1;\
					}


<pre>#define LOOP(x,y) 	while(x<=y)\
					{\
						printf("%d", x);\
						x+=1;\
					}

2 Ответов

Рейтинг:
4

Richard MacCutchan

Я могу только предположить, что вы делаете что-то вроде

LOOP(1, 7)

который оценивается в
while(1 <= 7)
{
    printf("%d", 1);
    1++;
}

И это никогда не сработает. То x поле должно быть lvalue, то есть неконстантной числовой переменной, которую можно изменить.


Рейтинг:
15

Jochen Arndt

Один именующее выражение это объект, который имеет идентифицируемое местоположение в памяти. Только они могут быть изменены. Вероятно, вы передаете целочисленные литералы в свой макрос:

LOOP(1,3);
Это не сработает, потому что литералы 1 и 3 это не lvalues.

Просто разверните код, как это делает препроцессор:
while(1<=3)
{
    printf("%d", 1);
    // This is not allowed!
    // The left side must be an lvalue
    1++;
}


Избегайте таких макросов вообще. Они склонны к нежелательным побочным эффектам. Пример:
int x = 1;
int y = 3;
LOOP(x--, ++y);
Хотя вышеизложенное будет компилироваться без ошибок, неизвестно, что произойдет, и у вас будет разное количество циклов, выполняемых с разными компиляторами.

Решение заключается в использовании встроенных функций при использовании недавнего компилятора языка Си:
static inline void loop(int x, int y)
{
    while (x<=y)
    {
        printf("%d", x);
        x++;
    }
}
Однако это позволяет только ints должен быть передан (с преимуществом проверки типов) и может быть проигнорирован компилятором (он все еще может создавать и вызывать функцию).