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

前端 未结 16 1787
隐瞒了意图╮
隐瞒了意图╮ 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.

提交回复
热议问题