用于 C 和 C++ 函数签名的可移植未使用参数宏

问题描述 投票:0回答:5

我有兴趣创建一个宏来消除未使用的变量警告。

这个问题描述了一种通过在函数代码中编写宏来抑制未使用参数警告的方法:

在 C/C++ 中实现未使用宏的通用编译器独立方法

但是我对可以在函数签名中使用的宏感兴趣:

void callback(int UNUSED(some_useless_stuff)) {}

这是我用Google挖出来的(来源

#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#elif defined(__cplusplus)
# define UNUSED(x)
#else
# define UNUSED(x) x
#endif

这可以进一步扩展到其他编译器吗?

编辑:对于那些无法理解标记如何工作的人:我想要一个适用于 C 和 C++ 的解决方案。这就是为什么这个问题被标记为 C 和 C++,并且这就是为什么仅 C++ 的解决方案是不可接受的。

c++ c macros warnings
5个回答
36
投票

我的做法是这样的:

#define UNUSED(x) (void)(x)
void foo(const int i) {
    UNUSED(i);
}

我在 Visual Studio、Intel、

gcc
clang
中没有遇到过问题。

另一种选择是仅注释掉参数:

void foo(const int /*i*/) {
  // When we need to use `i` we can just uncomment it.
}

12
投票

只是一件小事,最好使用

__attribute__((__unused__))
作为
__attribute__((unused))
,因为未使用的可能在定义为宏的地方,我个人对这种情况有一些问题。

但是我使用的技巧是,我发现更具可读性的是:

#define UNUSED(x) (void)x;

它仅适用于方法的变量和参数,而不适用于函数本身。


10
投票

经过测试并遵循评论,问题中提到的原始版本已经足够好了。

使用:

#define UNUSED(x) __pragma(warning(suppress:4100)) x
(在评论中提到),可能是在 MSVC 上编译 C 所必需的,但这是一个很奇怪的组合,我最后没有包含它。


6
投票

在许多编译器中,我使用了以下编译器,但不包括对 lint 的支持。

#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
#       define PGM_GNUC_UNUSED         __attribute__((__unused__))
#else
#       define PGM_GNUC_UNUSED
#endif

经过测试的编译器:GCC、Clang、EKOPath、Intel C Compiler / Composer XE、Cygwin / Linux / MSYS 上的 MinGW32、Cygwin / Linux 上的 MinGW-w64、Sun ONE Studio / Oracle Solaris Studio、Visual Studio 2008 / 2010。

使用示例:

pgm_tsc_init (
        PGM_GNUC_UNUSED pgm_error_t**   error
        )
{
...
}

PGM
是这个基于 C 的项目的标准前缀。
GNUC
是 GLib 对此属性的约定。

我认为在某些情况下编译会发出关于

__attribute__
的警告,但肯定没有错误。


0
投票

从 C++17 开始,现在有 [[maybe_unused]]。它也有 C23 版本:

void callback([[maybe_unused]] int some_useless_stuff) {}

这是 godbolt 的结果

© www.soinside.com 2019 - 2024. All rights reserved.