2015-06-20 24 views
0

玩一个宏,想想下面的场景。为变量声明一个已经存在于调用宏的函数中的宏,为什么编译器不会抱怨。当我在代码声明一个变量,它给我一个警告:为什么我在函数中已经存在的宏中声明一个具有相同名称的变量时不会收到警告?

重新界定为“临时”

的我认为这是预期的行为,并在标准(ANSI C)进行记录,但找不到在哪里。

例如这样的代码:

#define TEST() { \ 
    int temp = 10; \ 
} 

int main() { 

    int temp = 999; 

    printf("\ntemp: %d", temp); 
    TEST(); 
    printf("\ntemp: %d", temp); 
} 

回答

2

鉴于您的代码和上述宏时,C preprocessor生成以下内容:

int main() { 

    int temp = 999; 

    printf("\ntemp: %d", temp); 
    { 
    int temp = 10; 
    } 
    printf("\ntemp: %d", temp); 
} 

这是C编译器接收的代码。

内部{ .. }被称为nested scope。在你的情况下,这个嵌套的内部作用域包含一个变量temp,其中已经有一个在周围的外部作用域(variable shadowing)。这会触发你所看到的警告。

注意:在具体实例中,可变temp在嵌套范围中声明,从未使用过,因而适用范围关闭除去该变量。它本质上是NOP

2

的宏扩展为一个块。块内部是一个单独的作用域,您可以在其中声明与外部具有相同名称的变量。他们会影响外部变量。这样做通常不是一个好主意。

+0

这是什么意思?用一个已经在函数内部使用过的变量做宏? – Anatoly

+0

@Anatoly:“做这个”塞巴斯蒂安提到了“影子变数”。如果你收到这样的警告,那么清理你的代码是一个好主意,因为阴影可能是错误和头痛的原因。 – Jens

+0

@Jens,谢谢! – Anatoly

相关问题