[英]How to use UNUSED macro to silence warning within a CONSTEXPR function?
[英]How to mark a constexpr function's parameter unused?
考慮這個經典的例子:
template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&array)[N]) noexcept { return N; }
現在這個工作正常,但有一個煩惱, gcc發出警告:
warning: unused parameter ‘array’ [-Wunused-parameter]
已知解決方案:
(void)arr;
對函數,我得到error: body of constexpr function '...' not a return-statement
。 arraySize(T (&)[N])
,但我想命名參數有兩個原因:
return sizeof(array)/sizeof(array[0]);
,但這種方法不是普遍的解決方案,而且我認為還有return N;
更好,在眼睛上肯定更容易。 { (void)array; return N; }
{ (void)array; return N; }
{ (void)array; return N; }
是允許的。 在使用C ++ 11時,如何很好地消除未使用的參數警告 ?
試試這個。 我有時會使用這種方法
template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (& /*array*/ )[N]) noexcept { return N; }
我建議使用以下(ab)逗號運算符:
return (void)array, N;
對於新的googlers:
C ++ 17添加了[[maybe_unused]]
屬性,可以像這樣使用:
template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&array)[N] [[maybe_unused]]) noexcept { return N; }
最好的解決方案是禁止使用第二個點,即使用T(&)[N]
。
另一種可能的方法,如注釋,是使用以下返回值:
return array ? N : N;
我很確定編譯器會擺脫它,並且在運行時不會出現性能問題。
正如@ fnc12和@skypjack都指出的那樣,沉默未使用的參數編譯器警告的慣用方法是不給參數命名。
constexpr std::size_t arraySize(T (& /*array*/ )[N]) noexcept { return N; }
使用/**/
comments解決了可讀性異議。 它沒有在編譯器消息中修復名稱,但我認為最可能出現的情況是“未聲明的標識符”,一旦您注意到標識符被注釋,這很容易解決。
如果您真的死於慣用方式,那么只需抑制警告(如果您的編譯器允許,則在本地)。
使用#pragma GCC diagnostic
抑制GCC中的警告 。
使用#pragma warning suppress
在Visual Studio中抑制警告
我建議不要在代碼中添加“虛擬”引用來關閉編譯器。 無緣無故地引用一個未使用的參數而不是抑制編譯器警告會不必要地增加代碼的復雜性,並且可能會使未來的維護者混淆為什么會出現這種情況。
未命名的論證是正確的解決方案。
所以你可以使用中間函數:
template <typename T>
constexpr void avoid_warning_for_unused_parameter(T&&) noexcept{}
然后:
template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&array)[N]) noexcept
{
avoid_warning_for_unused_parameter(array);
return N;
}
對於C ++ 11,你不得不破解:
template <typename... Ts>
constexpr auto return_first_and_avoid_warning_for_unused_parameters(T&&t, Ts&&) noexcept
-> decltype(t)
{
return t;
}
template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&array)[N]) noexcept
{
return return_first_and_avoid_warning_for_unused_parameters(N, array);
}
gcc提供了未使用的屬性 ,可以按如下方式使用:
constexpr std::size_t arraySize(__attribute__((unused)) T (&array)[N]) noexcept { return N; }
^^^^^^^^^^^^^^^^^^^^^^^
Ben Deane最近討論了一種使用lambdas抑制此警告的C ++ 11方法 ,結合逗號運算符看起來像這樣:
#define UNUSED(x) [&x]{}()
//...
return UNUSED(array), N;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.