C 非调试配置中未使用的变量

C 非调试配置中未使用的变量,c,dry,C,Dry,我经常写这样的代码: int result = someMethod(arg1,arg2,...); assert(result==0) #ifdef DEBUG #define assert(e) if(!e) printf("something's wrong"); #else #define assert(...) #endif 假设assert的定义如下: int result = someMethod(arg1,arg2,...); assert(result==0) #ifde

我经常写这样的代码:

int result = someMethod(arg1,arg2,...);
assert(result==0)
#ifdef DEBUG
#define assert(e) if(!e) printf("something's wrong");
#else
#define assert(...)
#endif
假设assert的定义如下:

int result = someMethod(arg1,arg2,...);
assert(result==0)
#ifdef DEBUG
#define assert(e) if(!e) printf("something's wrong");
#else
#define assert(...)
#endif
第一段代码将给出关于“result”是未使用的var的警告

我可以这样做:

#ifdef DEBUG
    int result = someMethod(arg1,arg2,...);
#else
    someMethod(arg1,arg2,...);
#endif
assert(result==0)
但这对我来说似乎很不干燥


我还能做什么?

空白和换行符与编译器无关,所以

int result = someMethod(arg1,arg2,...);
assert(result==0);
(void)result;
#ifdef DEBUG
    int result =
#endif
    someMethod(arg1,arg2,...);
assert(result==0)

空格和换行符与编译器无关,因此

#ifdef DEBUG
    int result =
#endif
    someMethod(arg1,arg2,...);
assert(result==0)
类似宏的断言代码,仅在调试配置中启用某些代码段

#if defined(NDEBUG)
#define assertion_code(v)
#else
#define assertion_code(v) v
#endif
现在你可以写作了

assertion_code(int result =) expr();
assert(result == 0);
类似宏的断言代码,仅在调试配置中启用某些代码段

#if defined(NDEBUG)
#define assertion_code(v)
#else
#define assertion_code(v) v
#endif
现在你可以写作了

assertion_code(int result =) expr();
assert(result == 0);

有一种明确的方式:

static inline void debug(const char *msg)
{
#ifdef DEBUG
    printf("%s\n", msg);
#else
    (void)msg;
#endif
}
然后:


当出现问题时,您很有可能不想继续正常工作,因此显式条件子句可能会很有用。或者您是否计划在关闭调试时忽略错误?

有一种明确的方法:

static inline void debug(const char *msg)
{
#ifdef DEBUG
    printf("%s\n", msg);
#else
    (void)msg;
#endif
}
然后:


当出现问题时,您很有可能不想继续正常工作,因此显式条件子句可能会很有用。或者,您是否计划在关闭调试时忽略错误?

您可能希望将其包装在宏中以使其可用。@pmr只是显示机制,但对宏来说……更好。您可能希望将其包装在宏中以使其可用。@pmr只是显示机制,但对宏来说……更好。您为什么要重新定义assert?包括在内。另外,请注意,NDEBUG通常是使用的,而不是调试。SomeMethod应该命名为someFunction。@williampersell你是对的,这很愚蠢:-你为什么要重新定义assert?包括在内。另外,请注意,NDEBUG通常是使用的,而不是调试。SomeMethod应该命名为someFunction。@Williampersell你说得对,这很愚蠢:-