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 等效项?的主要内容,如果未能解决你的问题,请参考以下文章

在整数 SSE 寄存器中移动更高或更低 64 位的最快方法

如何创建面向 .NET 5 或更低版本的 NuGet 包。但不是 .NET 6 或更高版本

如何在 iOS 10 或更低版本中使用 webview? [复制]

在 IOS 4.x 或更低版本中,将子视图添加到视图时不会调用 viewDidAppear 方法,为啥?

上传失败您需要使用版本号为29或更低的SDK

iOS v10 或更低版本:如何以编程方式在导航栏底部添加 UISearchController