禁用跨功能的clang警告

时间:2015-02-22 23:15:43

标签: c++ clang suppress-warnings

在clang中,我们可以忽略here所述的警告。

在我的示例中,如果代码直接包含在pragma中,则可以正常工作(请参阅(1))。但是,这在(2)处不起作用,因为违规代码位于函数(3)内。如果我用一个编译指示(注释掉)包含该函数,则仅忽略该警告。如果函数在头文件中,我也可以用编译指示括住#include

我通常希望对此功能发出警告,但我不想为它所使用的整个文件禁用它们。那么有没有办法在每次使用的情况下禁用警告?

#include <iostream>

// #pragma clang diagnostic push
// #pragma clang diagnostic ignored "-Wfloat-equal"
template <class T>
bool compare (const T lhs, const T rhs)
{
  return lhs == rhs; // (3)
}
// #pragma clang diagnostic pop

int main ()
{
  const float a = 1.1f, b = 1.1f;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wfloat-equal"
  const bool eq1 = a == b; // (1)
#pragma clang diagnostic pop

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wfloat-equal"
  const bool eq2 = compare (a, b); // (2)
#pragma clang diagnostic pop

  std::cout << eq1 << " " << eq2 << std::endl;

  return 0;
}

使用-Weverything

进行编译

2 个答案:

答案 0 :(得分:1)

使用==发出警告以进行比较,而不是通话。如果您有两个同时调用compare<float>的功能,并且您会以某种方式设法取消第一个呼叫的警告,那么在第二个呼叫中就不会有任何警告:compare<float>已经被实例化,并且只有在实例化时才能检测到任何事情发出警告。

您应该可以找到一条警告,该警告可以附加到compare<float>的来电。在呼叫站点有效地评估默认参数,并且快速测试表明它适用于此:

template <typename T>
bool compare(T a, T b, bool = decltype(a == b)()) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wfloat-equal"
  return a == b;
#pragma clang diagnostic pop
}

// Gets a warning
void f() { compare(1.0f, 1.0f); }

// Suppress the warning here
void g() { compare(1.0f, 2.0f, false); }

// Gets another warning
void h() { compare(1.0f, 3.0f); }

答案 1 :(得分:0)

您可以通过仅实例化此功能来解决此问题:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wfloat-equal"
template <>
bool compare (const float lhs, const float rhs)
{
  return lhs == rhs;
}
#pragma clang diagnostic pop

现在,所有其他警告都会出现,所以如果你做了别的事情&#34;错误&#34;,它仍然会发出警告。

但正如我在评论中所说,它可能被认为是编译器中的一个错误,所以我会报告它并看看clang开发人员说的是什么。