在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
答案 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开发人员说的是什么。