问个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是没有关系的。