int bar = 2;
if (bar)
{
int bar;
}
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;
}
请注意,在纯 C 中执行类似操作不会产生崩溃:
int bar = 2;
if (bar)
{
char buff[10];
int bar = sprintf(buff, "%d",bar);
}