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

前端 未结 4 439
终归单人心
终归单人心 2020-11-30 02:20

I\'m interested in creating a macro for eliminating the unused variable warning.

This question describes a way to suppress the unused parameter warning by writing a

相关标签:
4条回答
  • 2020-11-30 02:47

    Just one small thing, better using __attribute__((__unused__)) as __attribute__((unused)), because unused could be somewhere defined as macro, personally I had a few issues with this situation.

    But the trick I'm using is, which I found more readable is:

    #define UNUSED(x) (void)x;

    It works however only for the variables, and arguments of the methods, but not for the function itself.

    0 讨论(0)
  • 2020-11-30 03:04

    After testing and following the comments, the original version mentioned in the question turned out to be good enough.

    Using: #define UNUSED(x) __pragma(warning(suppress:4100)) x (mentioned in comments), might be necessary for compiling C on MSVC, but that's such a weird combination, that I didn't include it in the end.

    0 讨论(0)
  • 2020-11-30 03:08

    Across many compilers I have used the following, excluding support for lint.

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

    Tested compilers: GCC, Clang, EKOPath, Intel C Compiler / Composer XE, MinGW32 on Cygwin / Linux / MSYS, MinGW-w64 on Cygwin / Linux, Sun ONE Studio / Oracle Solaris Studio, Visual Studio 2008 / 2010.

    Example usage:

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

    PGM is the standard prefix for this C based project. GNUC is the convention from GLib for this attribute.

    I think one compile warns about __attribute__ in certain circumstances but certainly no error.

    0 讨论(0)
  • 2020-11-30 03:13

    The way I do it is like this:

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

    I've not had a problem with that in Visual Studio, Intel, gcc and clang.

    The other option is to just comment out the parameter:

    void foo(const int /*i*/) {
      // When we need to use `i` we can just uncomment it.
    }
    
    0 讨论(0)
提交回复
热议问题