读书人

问个C/C++程序预编译时局部变量值

发布时间: 2012-09-27 11:11:17 作者: rapoo

问个C/C++,程序预编译时,局部变量值的问题,有个小程序,希望大家解释下,谢谢!

C/C++ code
#include <stdio.h>int main(){    int i=1;    for(i = 2; i < 5; ++i)    {        #if i==0                      printf("AAA\n");        #endif        if(i == 3)                        printf("BBB\n");    }    return 0;}

程序很简单,结果是:
AAA
AAA
BBB
AAA

我知道#if #endif是预编译时起作用,我想知道的是预编译的时候变量i的值是0吗?为什么这样呢?这里i是个局部变量,如果把i设成全局变量的话也是效果如此的,希望明白这个问题的朋友给解释下,谢谢了!

[解决办法]
预编译的表达式和程序中使用的变量 i 没有关系.
在 #if 里面, 没有通过 #define 定义过的标示符被认为是 0, 定义过的被处理成非 0.
MSDN:
This constant expression is considered true (nonzero) if the identifier is currently defined; otherwise, the condition is false (0). An identifier defined as empty text is considered defined.
[解决办法]
#if i==0是成立的,这里i被预编译器看作是一个未定义的符号,而把它处理成0值。
[解决办法]
以下是预处理之后的结果。
预处理阶段的宏名i和编译阶段的变量名i没有任何关系。
C/C++ code
...extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__));# 938 "/usr/include/stdio.h" 3 4# 3 "<stdin>" 2int main(){    int i=1;    for(i = 2; i < 5; ++i)    {            printf("AAA\n");        if(i == 3)            printf("BBB\n");    }    return 0;}
[解决办法]
探讨
“编译期”和“运行时”不是一回事!

[解决办法]
应该和这个效果是一样的:
#ifndef i
printf("AAA\n");
#endif

预编译指令里的i和局部变量i是没有关系的。


读书人网 >C语言

热点推荐