Чтение переменных с препроцессором C - PullRequest
3 голосов
/ 20 октября 2011

Я сталкиваюсь со следующей проблемой при попытке использовать сцепление с препроцессором C :

#define substitute(id) var##id
int main()
{
     int var0 = 999;
     int var1 = 998;
     int var2 = 997;
     int var3 = 996;
     int var4 = 995;

     int i = 0;

     for(i; i < 5; i++)
     {
          printf("Valor: %i \n",  substitute(i));      
     }

     system("PAUSE");
     return 0;

}

Есть ли способ, чтобы препроцессор мог прочитать значениена «я» вместо простого объединения «вари»?

Ответы [ 8 ]

2 голосов
/ 20 октября 2011

Это невозможно на этапе препроцессора , потому что то, что вы хотите, зависит от значений, которые известны только позже, при времени выполнения .

Вам нужен массив и оператор индекса, var[i].

2 голосов
/ 20 октября 2011

Нет. Препроцессор работает перед компиляцией и, следовательно, перед выполнением.

Определение

#define substitute(id) var##id

приведет к расширению вашего цикла:

 for(i; i < 5; i++)
 {
      printf("Valor: %i \n",  vari);      
 }

Препроцессор не знает ни о переменной i, ни о ней.

Вероятно, вам следует использовать массив:

int var[5] = {999,998,997,996,995};

и доступ к нему через []:

for(i; i < 5; i++)
{
    printf("Valor: %i \n",  var[i]);      
}
0 голосов
/ 23 октября 2011

Как многие говорили - нет, макросы ничего не знают о том, что происходит во время компиляции программы или
во время выполнения.Но ... если вы хотите, чтобы смог сгенерировать какой-нибудь хакерский код с макросом, который напрямую работает со стеком (не пытайтесь делать это дома один - он может взорвать ваш компьютер !! :-)) - определите вашмакрос как:

#define substitute(adr, max, id) *(adr + max - id)

и вызовите так:

printf("Valor: %i \n",  substitute(&var4,4,i));

Но имейте в виду, что это просто для любопытства, в реальной жизни не рекомендуется играть напрямую со стеком,потому что компилятор может (и обычно будет) переупорядочивать распределение переменных в стеке, а также вы рискуете столкнуться с некоторыми неприятными ошибками и т. д. Так что, как говорили другие, лучше создать массив и работать с ним.

НТН!

0 голосов
/ 20 октября 2011

Зачем вы делаете это с препроцессором?

Кажется, вы пытаетесь заново изобрести массивы:

int main() {
    int var[] = {999, 998, 997, 996, 995};
    int i;

    for (i=0; i<5; i++)
        printf("Valor: %i\n", var[i]);
    return 0;
}
0 голосов
/ 20 октября 2011

Нет, я - оценка времени выполнения.Для препроцессора нет никакого способа узнать, какое значение я мог бы иметь.

0 голосов
/ 20 октября 2011
Макросы

C раскрываются только во время компиляции, и ваша строка printf станет

      printf("Valor: %i \n",  vari);      
0 голосов
/ 20 октября 2011

Нет, поскольку препроцессор работает во время компиляции, а не во время выполнения, но вы можете использовать массив:

int vars[] = { 999, 998, 997, 996, 995 };

for (int i = 0; i < 5; ++i)
    printf("Valor: %i \n", vars[i]);
0 голосов
/ 20 октября 2011

Вы должны знать, что макрос разрешается один раз (препроцессором) перед компиляцией файла, поэтому во время выполнения каждая итерация в цикле будет отображать один и тот же результат при "вызове" замены.

...