编译器无法捕获条件块中的变量重定义

Fel*_*xyz 2 c compiler-construction gcc objective-c llvm

int bar = 2;
if (bar)
{
   int bar;
}
Run Code Online (Sandbox Code Playgroud)

gcc或Clang都没有设法为此发出警告(或错误),程序在启动时立即崩溃.有这么好的理由吗?看起来似乎并不难以捕捉到.这是块作用域的基础:嵌套作用域继承了封闭块的名称......

有什么解释吗?

编辑:事实证明崩溃是由于使用Clang.我来回测试了很多次,似乎可以确定变量重定义和Clang的组合会导致崩溃.但是,我无法在测试项目中重现崩溃,所以请参考.

问题结果与Objective-C相关.正如Jonathan Leffler所指出的那样,在内部范围内执行'int bar = bar'会从自身初始化变量,这就是导致问题的原因,当初始化是通过Objective-C方法调用完成的.

以下显示了操作中的错误:

-(void)crasher
{
   NSNumber* bar = [NSNumber numberWithInt:2];
   if (bar)
   {
      NSString* bar = [self doit:bar];
   }
}

-(NSString*)doit:(NSNumber*)num
{
   NSString* str = [num stringValue];   // This line causes the crash
   return str;
}
Run Code Online (Sandbox Code Playgroud)

请注意,在纯C中执行类似的操作不会导致崩溃:

int bar = 2;
if (bar)
{
   char buff[10];
   int bar = sprintf(buff, "%d",bar);       
}
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 7

这里没什么好抓的.内部块中的变量是一个完全不同的变量,它将变量隐藏在外部块中.这是从一开始就存在的语言的完美标准特征.

您遇到的崩溃与您发布的代码完全无关.除非你在代码中犯了错误,否则在假设你正在处理外部变量时使用内部变量.