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

Portable UNUSED parameter macro used on function signature for C and C++

本文关键字:c++ 函数 用于 未使用 参数 可移植      更新时间:2023-10-16

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

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

在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++的解决方案是不可接受的。

我是这样做的:

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

我没有在Visual Studio, Intel, gccclang中遇到问题。

另一个选项是直接注释掉参数:

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

只是一件小事,最好使用__attribute__((__unused__))作为__attribute__((unused)),因为未使用的可以在某个地方定义为宏,我个人对这种情况有一些问题。

但是我使用的技巧是,我发现更容易读懂的是:

#define UNUSED(x) (void)x;

它只对方法的变量和参数起作用,而对函数本身不起作用。

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

使用:#define UNUSED(x) __pragma(warning(suppress:4100)) x(在评论中提到),对于在MSVC上编译C可能是必要的,但这是一个如此奇怪的组合,所以我没有在最后包括它。

在许多编译器中,我使用了以下内容,不包括对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, MinGW32 (Cygwin/Linux/MSYS), MinGW-w64 (Cygwin/Linux), 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__,但肯定没有错误。