controlling expression is constant
次のようなassertステートメントで警告が表示されます。
assert(... && "error message");
このアサートに関するこの警告はなぜですか?この警告を抑制するにはどうすればよいですか?
NVCCはNVIDIAcudaコンパイラであり、LLVMに基づいていると思います。同じものがGCCまたはVisualC++コンパイラで正常にコンパイルされるのに、なぜこの警告が表示されるのですか?
controlling expression is constant
次のようなassertステートメントで警告が表示されます。
assert(... && "error message");
このアサートに関するこの警告はなぜですか?この警告を抑制するにはどうすればよいですか?
NVCCはNVIDIAcudaコンパイラであり、LLVMに基づいていると思います。同じものがGCCまたはVisualC++コンパイラで正常にコンパイルされるのに、なぜこの警告が表示されるのですか?
ポータブルな代替手段(おそらくマクロにラップされている)は次のようになります。
{
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)"が失敗しました[...]
コードの先頭近くに次を追加します。
#pragma diag_suppress boolean_controlling_expr_is_constant
これにより、アサーションに関連付けられた警告だけでなく、「式の制御は一定です」に関するすべてのコンパイラ警告が抑制されることに注意してください。
コンパイル時に定義された(または導出できる)定数またはプロパティをチェックするときにこの警告が表示されることがあります。そのため、私の経験では、警告は一般的に無害であり、無視しても問題ありません。
私はこの正確な問題に遭遇し、最終的にデバイスの警告を無効にする方法を見つけました。詳細はこちら...
特定の警告を無効にするには、このページ( http://www.ssl.berkeley.edu/~jimm/grizzly_docs/SSL/opt/intel/cc/9.0/)にリストされているトークンと組み合わせて-Xcudafeフラグを使用する必要があります。 lib / locale / en_US / mcpcom.msg)。たとえば、「制御式は一定です」という警告を無効にするには、以下をNVCCに渡します。
-Xcudafe "--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
。