7

我收到这样的controlling expression is constant断言声明警告:

assert(... && "error message");

为什么这个断言上的这个警告?我怎样才能抑制这个警告?

NVCC 是 NVIDIA cuda 编译器,我认为它基于 LLVM。当使用 GCC 或 Visual C++ 编译器可以正常编译时,为什么会给出这个警告?

4

5 回答 5

3

在代码开头附近的某处添加以下内容:

#pragma diag_suppress boolean_controlling_expr_is_constant

请注意,这将抑制“控制表达式是常量”的所有编译器警告,而不仅仅是与您的断言相关的警告。

在检查编译时定义(或可以派生)的常量或属性时,有时会收到此警告,因此根据我的经验,该警告通常是良性的,可以忽略。

于 2014-05-27T21:02:49.187 回答
3

一个可移植的替代方案(可能包含在宏中)将类似于:

 {
     const bool error_message = true;
     assert([...] && error_message);
 }

澄清我的意思:

#define myAssert(msg, exp) { const bool msg(true); assert(msg && (exp)); }
// usage:
myAssert(ouch, a && b);

...给出例如:

断言“哎哟&&(a && b)”失败[...]

于 2009-11-11T03:09:01.607 回答
2

我遇到了这个确切的问题,最后找到了一种方法来禁用设备上的警告。以下是详细信息...

要禁用特定警告,您需要将 -Xcudafe 标志与此页面上列出的令牌结合使用 ( http://www.ssl.berkeley.edu/~jimm/grizzly_docs/SSL/opt/intel/cc/9.0/ lib/locale/en_US/mcpcom.msg)。例如,要禁用“控制表达式是常量”警告,请将以下内容传递给 NVCC:

-Xcudafe "--diag_suppress=boolean_controlling_expr_is_constant"

这对我有用!有关其他警告,请参阅上面的链接。

于 2013-06-13T20:03:39.387 回答
0

试试#pragma warning

于 2009-11-11T03:25:22.603 回答
0

如果它是基于 LLVM 的,那么你可以使用这样的东西:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmultichar"

char b = 'df'; // no warning.

#pragma clang diagnostic pop

通过 Pragmas 控制诊断

于 2009-11-11T03:07:28.070 回答