【问题标题】:Suppress warning: unused variable抑制警告:未使用的变量
【发布时间】:2017-03-14 09:20:55
【问题描述】:

尝试使用以下命令编译我的代码: g++ Error.cpp -Wall -std=c++0x -o 文件名
我收到警告:Error.cpp:40:30: 警告:未使用的变量 'ostr' [-Wunused-variable]

我已经看到可以移除 -Wall 以抑制警告,但我不想这样做。我想在我的代码中加入一些东西来解决它。顺便说一句,只编码了大约 6 个月。

// Error.cpp

#define _CRT_SECURE_NO_WARNINGS 
// Tried using #define _CRT_UNUSED then doing _CRT_UNUSED(ostr) down below
#include <iomanip>
#include <iostream>
#include <cstring>
#include "Error.h"

void Error::message(const char* errorMessage) {
    clear();
    m_message = new char[strlen(errorMessage) + 1];
    strcpy(m_message, errorMessage);
}

void Error::operator=(const char* errorMessage) {
    message(errorMessage);
}

Error::operator const char*() const {
    return m_message;
}

Error::operator bool() const {
    return m_message == nullptr;
}

std::ostream& ict::operator<<(ostream& ostr, const Error& E) {
    (void)ostr; // This didn't work, i still get the warning with or without it
    if (!bool(E)) { const char*(ostr); }
    return ostr;
}

编辑:是的,第 40 行是带有 if 的行。出于某种原因,我曾认为const char*(ostr) 会将m_message 放在ostr 中,然后它可以返回并输出到其他地方。我没有意识到我只是在 if 语句中创建了一个无用的变量,我认为我的运算符重载会发挥作用,尽管我不能 100% 确定我是否正确使用它......

【问题讨论】:

  • 如果您只想抑制文件内的警告,您可以查看文档的这一部分:gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html
  • 第 40 行是哪一行?我敢打赌它是带有if 的那个,在这里你声明了一个const char* 类型的局部变量ostr(在它的名字周围加上不必要的括号)。您想在那里实现什么目标?
  • 警告位于if (!bool(E)) { const char*(ostr); } 行,它声明了一个名为ostr 的变量,该变量隐藏了作为函数参数的ostr。您能解释一下您打算该声明实际实现的目标吗? .... 因为,很可能,它没有实现它。
  • 仅供参考,我们在 SO 上保留了 good C++ books 的列表;你可能想看一看。
  • 编译器错误和警告告诉您它们源自哪一行。实际上,在您的实际问题中包含这些信息并注意它,在诊断 C++ 错误和警告时非常重要。

标签: c++ c++11 suppress-warnings


【解决方案1】:

正如this live example 所示,问题不在于函数参数ostr:返回语句使用了那个参数。

问题是您在if 中声明的const char * 类型的局部变量ostr:

if (!bool(E)) { const char*(ostr); }

括号是合法的,但是是多余的:该行等同于:

if (!bool(E)) { const char *ostr; }

您正在声明一个局部变量(恰好隐藏了函数参数),并且没有将它用于任何事情。

如果您想将消息从E 流式传输到ostr,您必须这样做:

if (!bool(E)) { ostr << static_cast<const char*>(E); }

【讨论】:

    【解决方案2】:

    您的意思是执行以下操作吗?

    std::ostream& ict::operator<<(ostream& ostr, const Error& E) {
        if (!bool(E)) { ostr << E.m_message; }
        return ostr;
    }
    

    【讨论】:

    • 这正是我想要做的,但是,该函数是全局的,并且它无法访问 m_message。
    • @JC_Darko 我们无法知道,因为您没有在问题中包含 Error 类的定义...
    • @Angew 我确实表明运算符重载是 ict 命名空间的一部分,而不是 Error 类的一部分。我当时认为这是足够的信息,但我想你不能假设该成员是私人或公共的......
    • 让操作员成为错误的“朋友”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2012-12-06
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    相关资源
    最近更新 更多