- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
由于编译器可以识别的纯粹愚蠢,我再次浪费了一些时间。这是有问题的源代码:
class f {
static int mVar;
int g(int x) { int mVar=3; return x+mVar; }
};
int f::mVar = 1;
问题是,我不小心添加了 int
在 mVar
前.当我编译它时:g++ -c -Wall -Wextra -Wshadow shadowtest.cpp
我没有收到任何关于本地 mVar
的警告隐藏静态成员 mVar
.
但如果我不将成员变量声明为静态,则 g++ 会正确发出警告:
class f {
int mVar;
f(int rVar) : mVar(rVar) {};
int g(int x) { int mVar=3; return x+mVar; }
};
用 g++ -c -Wall -Wextra -Wshadow shadowtest2.cpp
编译得到:
shadowtest2.cpp:5:24: warning: declaration of ‘mVar’ shadows a member of ‘f’ [-Wshadow]
int g(int x) { int mVar=3; return x+mVar; }
^
shadowtest2.cpp:3:9: note: shadowed declaration is here
int mVar;
^
使用 g++ 4.9.2 和 5.2.1 测试。
这是正确的行为还是错误?为什么?
编辑:我在这里提交了错误报告:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68374
编辑 2018-02-12:在这些版本中不发出警告:
g++-4.9 (Debian 4.9.4-2) 4.9.4
g++-5 (Debian 5.4.1-4) 5.4.1 20161202
g++-5 (Debian 5.5.0-8) 5.5.0 20171010
g++-6 (Debian 6.3.0-18) 6.3.0 20170516
g++-6 (Debian 6.4.0-12) 6.4.0 20180123
g++-7 (Debian 7.2.0-16) 7.2.0
g++-7 (Debian 7.3.0-3) 7.3.0
但成功警告:
g++-8 (Debian 8-20180207-2) 8.0.1 20180207 (experimental) [trunk revision 257435]
最佳答案
鉴于 -Wshadow in the gcc documentation 的描述,这看起来可能是一个错误:
Warn whenever a local variable or type declaration shadows another variable, parameter, type, class member (in C++), or instance variable (in Objective-C) or whenever a built-in function is shadowed. Note that in C++, the compiler warns if a local variable shadows an explicit typedef, but not if it shadows a struct/class/enum.
特别是考虑到 clang 会针对这种情况发出警告。这基本上是一个实现质量问题,因为这不是格式错误的代码。我会归档 a bug report .他们很可能会提供在这种情况下不警告的理由,或者他们最终会修复警告。
如果我们一直回到版本 4.5.4 see it live,看起来 gcc 曾经警告过这种情况.
关于c++ - G++ -Wshadow 不警告静态成员阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33739066/
在弄乱一些代码后,我意识到我需要编译器标志 -Wshadow,因此我决定也在 Codeblocks 中使用它,但它不起作用,并且我不明白为什么。 以下代码: #include int main(vo
不能低估 C++ 中隐藏警告的重要性,但是,在某些看起来(对我来说)完全有效的代码上有一个隐藏警告。 struct A{ int a; A(int a) : a(a){} }; 在这种
在一个大型项目中,我最近发现了一个隐藏成员变量的问题。为了避免将来出现这些问题,我想引入 -Wshadow 来显示这些问题。然而,大多数构造函数看起来像这样: struct Foo{ int ba
由于编译器可以识别的纯粹愚蠢,我再次浪费了一些时间。这是有问题的源代码: class f { static int mVar; int g(int x) { int mVar=3; r
我看到另一篇关于 GCC -Wshadow 过于严格的帖子。我的问题正好相反。 我重新审视了我编写的一些代码并注意到 -Wshadow 没有像我预期的那样工作: void free(double* x
伙计们,我真的很喜欢 -Wshadow 选项,因为它有助于发现一些可能有问题的代码片段。我想在一个非常大的项目中使用它,但我不能,因为它太严格了。例如,它会针对以下情况发出警告: struct Foo
在以下示例中: class A { public: int len(); void setLen(int len) { len_ = len; } // warning at th
背景:我为所有子目标(我的项目中存在许多模块)设置了 -WShadow 编译标志。 现在,我正在将第三方库(谷歌的 protobuf 在某些地方有阴影代码)添加到项目树中。这个第三方库将是父项目下的
在 GCC 7.3 和 8.2 上使用 -Wshadow=global 进行编译时,编译器会警告以下代码片段有阴影。 constexpr int A = 0; class Bar { public:
更新:gcc 有效,但 clang 无效 用 C++17 编译 GCC/Clang -Wshadow 会在阴影局部变量发生时发出警告,但对于结构化绑定(bind),此标志不起作用。这种情况如何暴露警告
-Wshadow将“每当局部变量遮蔽另一个局部变量时发出警告。”。 Visual C++ (2008) 中是否有等价物?我试过/W4 但它没有接受它。我也试过Cppcheck但那也没有看到。 例如如果
我使用 android studio 创建了一个 ndk 项目,一切顺利,我可以毫无问题地在模拟器上启动我的应用程序。但是当我将 Oboe 库添加到我的项目时,当我尝试启动或构建我的应用程序时会出现此
我是一名优秀的程序员,十分优秀!