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);
}