2011-10-20 28 views
3

我试图使用串联与Ç预处理当运行到以下问题:读变量

#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; 

} 

是否有预处理器能够读取的值的方式“我”而不是仅仅连接“vari”?

回答

2

否。预处理器在编译之前运行,因此在执行之前运行。

的定义

#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

谢谢。实际上,我已经为值而不是变量定义了#,所以使用预处理器的想法似乎不那么不合逻辑。尽管没有迭代的能力,但我认为唯一的解决方案是使用数组。 – ememorais

0

您需要知道,在编译文件之前,宏被解析了一次(由预处理器),因此在运行时,循环中的每次迭代将在“调用”替代时呈现相同的结果。

0

不,因为预处理器在编译时运行,不运行时,但你可以使用数组:

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

for (int i = 0; i < 5; ++i) 
    printf("Valor: %i \n", vars[i]); 
2

这不可能在预处理器阶段,因为你想要什么取决于稍后才知道的值,在运行时

你需要的是一个数组和索引操作符var[i]

-1

C宏只在编译时扩展,而您的printf线将成为

 printf("Valor: %i \n", vari);  
+0

预处理发生在编译之前。 –

+0

@LuchianGrigore是的,如果你那么挑剔。我认为谈论编译时和运行时是很常见的。编译时间将是采取源代码和制作二进制文件的事件。 – epatel

0

不,我是一个运行时的评价。预处理器无法知道我的价值。

0

你为什么要用预处理器做这件事?

你似乎在试图重塑阵列:

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

正如许多说 - 不,宏不知道在程序编译时或
运行时发生了什么事情。但是...如果你希望你可以生成一些宏的代码,直接与堆栈操作(不要试图在家里独自 - 它可以打破你的计算机!:-)) - 定义宏为:

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

,并呼吁像这样:

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

但请记住,这只是出于好奇,在现实生活中,不建议直接播放与堆栈,因为编译器可能(通常会)重新命令堆栈上的变量分配,还会冒着一些令人讨厌的错误发生等等...所以更好,如其他人所说 - 做一些数组和操作。

hth!