c++11(或更低版本)中 gcc __attribute__((unused)) 的 Visual Studio 等效项?
Posted
技术标签:
【中文标题】c++11(或更低版本)中 gcc __attribute__((unused)) 的 Visual Studio 等效项?【英文标题】:Visual Studio equivelent of gcc __attribute__((unused)) in c++11 (or lower)? 【发布时间】:2018-08-28 12:54:07 【问题描述】:我正在尝试编写一个宏以在用户需要时使用抑制未使用的变量警告(例如,在您尚未实现整个类时在派生类中)。我知道我可以删除变量名......但为了清楚起见,我更喜欢宏)。
到目前为止,我有这个:
#ifdef WIN32
#define UNUSED(x) x
#else
#define x __attribute__((unused))
#endif
像这样使用:
void test_fn(int UNUSED(test_var)) ...
我看到了这个帖子:suppressing-is-never-used-and-is-never-assigned-to-warnings-in-c-sharp,但它给了我一个我不能真正使用的结果(多行#pragmas)。
所以我的问题是,是否有与__attribute__((unused))
等效的 MSVS? - 即在同一行?
注意:这个问题没有回答我要问的是如何做:how-do-i-best-silence-a-warning-about-unused-variables,因为它没有涵盖如何在函数原型中以同时适用于 MSVS 和gcc。
【问题讨论】:
如果How do I best silence a warning about unused variables? 没有涵盖,那么应该添加到那里。 How do I best silence a warning about unused variables?的可能重复 如果你因为还没有实现整个类而收到警告,我很乐意让警告保持打开状态,而不是冒着以后忘记这样做的风险。 @ShafikYaghmour 我会在那里添加答案......如果我知道的话:) @Aconcagua 不,这里不是重复,因为这些答案不符合我的要求。注意:我在不在代码中的函数参数中使用 UNUSED(x),所以 void cast 等...不起作用。我也看过那篇文章:) 【参考方案1】:如果变量或函数参数可能未被使用,gcc's __attribute__((unused))
旨在抑制任何有关它的警告。
现在,如果您想要便携的东西,有多种选择:
-
如果你不使用它,
-
它是一个函数参数,只是不要命名它。
否则,干脆不要创建它。
如果它可能在某些情况下使用,只需通过转换为 void
确定使用一次:
(void)potentially_unused;
是的,第二个选项不在原型中,但必须留有余量。
升级到 C++17 并使用[[maybe_unused]]
。
【讨论】:
【参考方案2】:如果你的使用只是
void test_fn(int UNUSED(test_var)) ...
我知道我可以删除变量名...但为了清楚起见,我更喜欢宏)。
所以通过 MACRO 删除变量名:
你可以去
#define UNUSED(x) /*Empty*/
【讨论】:
是的,这就是我想要的!...事实上,它可能适用于 gcc 和 MSVS :) 谢谢。 只是想...额外的好处是,当您想使用该变量时,您必须删除 UNUSED(..) 部分,否则您会收到编译错误...很好...: ) 我的问题是将其发布到question I linked above 并作为副本关闭会更好吗? @code_fodder “没有一个设计” - 准确地说:不命名参数是标准,甚至在 C+ 之前+11(!) - 如果你直接这样做或使用宏来获得效果是无关紧要的...... 这个解决方案的好处是它甚至可以在 C 中工作,但仅用于声明(在定义中,参数 必须 被命名)。因此,如果您碰巧编写了一个与 C 兼容的标头(#ifdef __cplusplus extern "C"
的东西),您仍然可以使用这个技巧...以上是关于c++11(或更低版本)中 gcc __attribute__((unused)) 的 Visual Studio 等效项?的主要内容,如果未能解决你的问题,请参考以下文章
如何创建面向 .NET 5 或更低版本的 NuGet 包。但不是 .NET 6 或更高版本
如何在 iOS 10 或更低版本中使用 webview? [复制]