C++14作用域内变量重定义为何可无警告编译?
为啥这段C代码在C14下编译连警告都没有?
嘿,这事儿其实挺常见的——先给你拆解清楚:
你写的这段代码:
int x = 0; if (true) { int x = 2; }
完全符合C标准的规定。内部if块里的x是块级作用域的局部变量,它会"隐藏"(shadow)外部作用域的同名变量x。这种变量隐藏是C允许的合法操作,默认情况下编译器不会把它当成问题,哪怕你开了-Wall。
为啥-Wall没出警告?
别误会-Wall的作用——它虽然开启了一大堆常用警告,但并不包含变量隐藏的检测。要让编译器提醒你这种同名变量覆盖的情况,你得额外加一个编译选项:-Wshadow。
你用的GCC 5.3.1是支持这个选项的,只要把编译命令改成带-Wshadow,编译器就会弹出类似这样的警告:
warning: declaration of ‘x’ shadows a previous local [-Wshadow]
额外提一句
变量隐藏本身不是语法错误,有时候开发者是故意这么写的(比如在局部块里临时复用变量名处理小逻辑),但更多时候这可能是手滑导致的潜在bug。所以日常开发里,我建议把-Wshadow加到你的编译选项里,甚至可以用-Werror=shadow把它变成强制错误,从源头避免这类疏忽~
内容的提问来源于stack exchange,提问作者esurface
相关产品推荐
相关产品推荐

