Avoiding unused variables warnings when using assert() in a Release build

前端 未结 16 1697
隐瞒了意图╮
隐瞒了意图╮ 2020-12-05 09:10

Sometimes a local variable is used for the sole purpose of checking it in an assert(), like so -

int Result = Func();
assert( Result == 1 );
<
相关标签:
16条回答
  • 2020-12-05 09:56

    The simplest thing is to only declare/assign those variables if the asserts will exist. The NDEBUG macro is specifically defined if asserts won't be effected (done that way round just because -DNDEBUG is a convenient way to disable debugging, I think), so this tweaked copy of @Jardel's answer should work (cf. comment by @AdamPeterson on that answer):

    #ifndef NDEBUG
    int Result =
    #endif
    Func();
    assert(Result == 1);
    

    or, if that doesn't suit your tastes, all sorts of variants are possible, e.g. this:

    #ifndef NDEBUG
    int Result = Func();
    assert(Result == 1);
    #else
    Func();
    #endif
    

    In general with this stuff, be careful that there's never a possibility for different translation units to be build with different NDEBUG macro states -- especially re. asserts or other conditional content in public header files. The danger is that you, or users of your library might accidentally instantiate a different definition of an inline function from the one used inside the compiled part of the library, quietly violating the one definition rule and making the runtime behaviour undefined.

    0 讨论(0)
  • 2020-12-05 09:56

    I'd use the following:

    #ifdef _DEBUG
    #define ASSERT(FUNC, CHECK) assert(FUNC == CHECK)
    #else
    #define ASSERT(FUNC, CHECK)
    #endif
    
    ...
    
    ASSERT(Func(), 1);
    

    This way, for release build, the compiler don't even need to produce any code for assert.

    0 讨论(0)
  • 2020-12-05 09:56

    If this code is inside a function, then act on and return the result:

    bool bigPicture() {
    
       //Check the results
       bool success = 1 != Func();
       assert(success == NO, "Bad times");
    
       //Success is given, so...
       actOnIt();
    
       //and
       return success;
    }
    
    0 讨论(0)
  • 2020-12-05 09:57
    int Result = Func();
    assert( Result == 1 );
    Result;
    

    This will make the compiler stop complaining about Result not being used.

    But you should think about using a version of assert that does something useful at run-time, like log descriptive errors to a file that can be retrieved from the production environment.

    0 讨论(0)
提交回复
热议问题