用于C和C ++函数签名的便携式UNUSED参数宏

时间:2011-08-17 10:03:02

标签: c++ c macros warnings

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

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

Universally compiler independent way of implementing an UNUSED macro in C/C++

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

void callback(int UNUSED(some_useless_stuff)) {}

这是我使用Google(source

挖出的内容
#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 ++解决方案是不可接受的。

4 个答案:

答案 0 :(得分:22)

我这样做是这样的:

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

我在Visual Studio,英特尔,gccclang中没有遇到任何问题。

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

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

答案 1 :(得分:9)

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

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

答案 2 :(得分:7)

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

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

#define UNUSED(x) (void)x;

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

答案 3 :(得分: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,英特尔C编译器/作曲家XE,Cygwin / Linux / MSYS上的MinGW32,Cygwin / Linux上的MinGW-w64,Sun ONE Studio / Oracle Solaris Studio,Visual Studio 2008/2010。< / p>

使用示例:

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

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

我认为在某些情况下,一个编译警告__attribute__,但肯定没有错误。