【问题标题】:How to trigger a warning when a certain function is called (not compiled)?调用某个函数(未编译)时如何触发警告?
【发布时间】:2021-02-27 09:38:28
【问题描述】:

如果我们写:

void foo() {
#warning "Danger Will Robinson!"
}

我们会在编译 foo() 时收到警告。现在,我想要做的是编译不发出警告,但如果foo()调用,则发出警告。

这可能吗,使用 g++ 和/或 clang++?

注意:这个问题有点类似于this one,关于将函数标记为“已弃用”(a-la C++14 的[[deprecated]] 属性)。但是,这是一个不同的语义。我不希望人们知道我的函数已被弃用,而是得到一个自定义警告。

【问题讨论】:

  • 恐怕这不可能。在这种情况下,我宁愿选择deprecated attribute
  • 编译器如何判断函数是否被调用?考虑if (run_time_function() > 40173) foo();
  • @DavidSchwartz 应该像处理已弃用的属性一样处理它。
  • @einpoklum 像this 这样的东西怎么样?有点hacky,但可以完成工作
  • 如果 GNU 在桌面上,那么就有 __attribute__ ((warning ("message"))) - 虽然我不确定这正是你所追求的。如果调用在已消除的分支上,死代码消除可以消除警告。

标签: c++ g++ compiler-warnings clang++


【解决方案1】:

C++11 添加了_Pragma,类似于#pragma,但宏可以扩展到它。因此,您可以制作一个宏,将其扩展到此警告和功能:

#include <cstdio>

void foo() {
  std::puts("foo is called!");
}

#define foo(...) _Pragma("message \"Danger Will Robinson!\"") \
  foo(__VA_ARGS__)

int main() { 
  foo(); 
}

这种方法的主要问题是它不会尊重重载,并且不会对名称为 foo 的任何函数发出警告。

【讨论】:

    【解决方案2】:

    来自 cmets 中 @StoryTeller 的建议,在 GCC 中部分有效:

     __attribute__ ((warning ("Danger Will Robinson!"))) 
    void foo() { }
    
    int bar() {
        const int x = 123;
        foo();
        return x;
    }
    

    为什么是“部分”?正如@StoryTeller 所说:

    如果调用在被消除的分支上,死代码消除可以消除警告

    看看This GodBolt example:当您启用优化以便内联函数时 - 警告属性将被忽略。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 2020-04-24
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多