我在断言语句中收到警告
controlling expression is constant
,如下所示:
assert(... && "error message");
为什么此断言会出现此警告?我怎样才能抑制这个警告?
NVCC是NVIDIA cuda编译器,我认为它是基于LLVM的。当 GCC 或 Visual C++ 编译器可以正常编译时,为什么它会给出此警告?
一个可移植的替代方案(可能包含在宏中)类似于:
{
const bool error_message = true;
assert([...] && error_message);
}
为了澄清我的意思:
#define myAssert(msg, exp) { const bool msg(true); assert(msg && (exp)); }
// usage:
myAssert(ouch, a && b);
...给出例如:
断言“ouch && (a && b)”失败 [...]
我遇到了这个确切的问题,并最终找到了一种禁用设备上警告的方法。详细信息如下...
要禁用特定警告,您需要结合使用 -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”
这对我有用!对于其他警告,请参阅上面的链接。
在代码开头附近添加以下内容:
#pragma diag_suppress boolean_controlling_expr_is_constant
请注意,这将抑制所有“控制表达式为常量”的编译器警告,而不仅仅是与断言相关的警告。
在检查编译时定义(或可以派生)的常量或属性时,我有时会收到此警告,因此根据我的经验,该警告通常是良性的,可以忽略。
如果它是基于 LLVM 的,那么你可以使用这样的东西:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmultichar"
char b = 'df'; // no warning.
#pragma clang diagnostic pop
来自通过指令控制诊断。
尝试
#pragma warning
。