【问题标题】:C++ Macro causing :"warning: unused variable "LOG__METHOD__" "C ++宏导致:“警告:未使用的变量“LOG__METHOD__”“
【发布时间】:2015-04-15 07:30:10
【问题描述】:

我的 C++ 代码中有一个宏,宏有一个未使用的变量。我收到该变量的警告 宏是打印类和方法名

#define LOG_ENTER(func_name, message)                                      \
    LOG_SET_METHOD(#func_name)                                             \
    LOG_MOD_INTERNAL(TC_TAG(ENTER) << message)
#define LOG_SET_METHOD(name) static const char LOG__METHOD__[] = "::" name "() ";

我们使用的是 gcc 版本 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)。

“警告:未使用的变量“LOG__METHOD__”“

如何抑制这个警告?它会引起更多噪音!

【问题讨论】:

  • 在在您的问题中显示宏以及您如何使用它。并包括工具链信息。警告禁用对于所使用的工具经常变化无常。
  • 第三个答案:stackoverflow.com/questions/15053776/… 可能会有所帮助
  • 未使用的变量的用途是什么?

标签: c++ gcc compiler-warnings gcc-warning compiler-flags


【解决方案1】:

消除此警告的常用方法是在虚拟表达式中使用变量:

int main() {
    int i;
    i;
}

但是,这会触发“警告:语句无效”,因为i 没有副作用并且它的值未被使用。为了让这个静音,我们明确地忽略了这个值:

int main() {
    int i;
    (void)i;
}

然后就是警告了。

【讨论】:

  • 这是一个 hack (恕我直言),编译器属性将是一个更清晰、更干净的解决方案(gcc 的 __attribute__((unused)))。
  • @Otomo 好吧,它是 the standard way to do it。而且语法不能被误认为是其他任何东西。无需求助于编译器魔法。
  • 有时很高兴看到 C++ 设置了如此低的关于什么是语句的阈值。
【解决方案2】:

一种禁用警告的方法:

template <typename T>
void UnusedVar(const T&) {}

然后使用:

UnusedVar(my_var);

转换为void 也是一种常用方式(但不适用于所有编译器):

(void) my_var; // or static_cast<void>(my_var)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 2016-04-30
    • 2012-08-25
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多