关于未使用值的警告并不总是出现
Warning about not used value does not always appear
我的一个朋友问了我下面的问题,但我不知道如何回答…
"考虑这个语句:
int* p;
…(让我们假设p被设置为指向有意义的东西)
*p++;
该语句首先将p加1,然后对其解引用。但问题是,当我编译这个时,我得到了这个警告:
ex-9-frepe。cc:28:9:警告:value computed not used [- unused-value]
*p++;
…这是有道理的。我不使用这个值。
在上面的练习中,你应该把语句完全括起来,所以我这样做了:
(*(p++));
这样,警告就消失了。这很奇怪,你知道为什么吗?我仍然没有使用值。
加上括号:
*(p++);
…警告依然存在。"
我的假设是编译器被最终值被括号括起来"(*(p++))"这一事实欺骗了,并认为这被认为是"使用"。但是我一点也不确定,所以我决定把这个话题拿出来辩论……
*p++;
该语句首先将p加1,然后对其解引用
实际上它将解引用p
的原始值。
并且,这两个步骤之间没有定义排序关系;也就是说,在一般情况下,只要原始值被取消引用,增量可以在之前或之后执行。但在这种情况下,两种可能的序列在可观察到的行为上没有区别。
其他版本的代码都具有完全相同的定义行为。警告是可选的(即不是C标准强制要求的);最有可能的解释是,你的编译器试图通过对第一个代码给出警告来提供帮助;它认为,如果你加入多余的圆括号,那么你是在试图使警告沉默。(不幸的是,这是关于警告的一种相当普遍的技术)。
如果这是不清楚的:警告是由于解引用操作未使用的结果(与增量无关);代码*p;
应该给出同样的警告。
要得到一个更准确的答案,你需要发布你的编译器的名称和版本号。
另一个编译器将冗余括号视为"元数据"的常见示例关于警告是:
if ( a = b ) // warning, did you mean '==' ?
if ( (a = b) ) // no warning - assume he really did mean '='
相关文章:
- 使用typeid警告未使用的变量
- 警告 C4552:">>":未使用表达式的结果
- 为什么我会收到警告,指出函数已使用但未定义,以及已定义但未使用?
- C++未使用的变量警告,即使我在函数结束时返回它
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- 为什么 Clang 警告未使用的指针和未使用的基元,而不是未使用的对象?
- 如何使 Visual Studio 2010 警告未使用的变量
- 提升::序列化警告未使用的变量file_version
- GCC和Clang不警告未使用的异常变量
- 避免在 openmp 并行块中使用预编译器语句出现未使用的变量警告
- 修复警告"field a is not used"如果字段在配置中未使用的好方法
- 抑制警告:未使用的变量
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- GCC 警告未使用的静态函数,但不警告静态内联:是否有实际区别?
- 为什么 clang -Wunused-member-函数不警告未使用的成员函数?
- 警告:未使用的变量“arrPixel”[-Wunused-variable]
- gcc警告未使用的RAII变量
- 警告:未使用计算的值
- g++-5.1.1仅在使用优化标志时警告未使用的变量