相关疑难解决方法(0)

如何最好地消除有关未使用变量的警告?

我有一个跨平台应用程序,在我的一些函数中,并没有使用传递给函数的所有值.因此我收到GCC的警告,告诉我有未使用的变量.

编码警告的最佳编码方式是什么?

围绕这个功能的#ifdef?

#ifdef _MSC_VER
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal qrLeft, qreal qrTop, qreal qrWidth, qreal qrHeight)
#else
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal /*qrLeft*/, qreal /*qrTop*/, qreal /*qrWidth*/, qreal /*qrHeight*/)
#endif
{
Run Code Online (Sandbox Code Playgroud)

这太丑了,但似乎是编译器喜欢的方式.

或者我在函数末尾为变量赋值为零?(我讨厌它,因为它改变了程序流程中的某些东西以使编译器警告静音).

有正确的方法吗?

c++ gcc warnings gcc-warning

212
推荐指数
13
解决办法
17万
查看次数

如何在C中抑制"未使用的参数"警告?

例如:

Bool NullFunc(const struct timespec *when, const char *who)
{
   return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

在C++中,我能够对/*...*/参数进行评论.但当然不是在C中,它给了我错误error: parameter name omitted.

c gcc gcc-warning

195
推荐指数
10
解决办法
15万
查看次数

为什么将未使用的函数参数值转换为void?

在一些C项目中,我看到了这段代码:

static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
    (void)ud;
    (void)osize;
    /* some code not using `ud` or `osize` */
    return ptr;
}
Run Code Online (Sandbox Code Playgroud)

这两个演员是否有任何目的?

c casting void

93
推荐指数
2
解决办法
2万
查看次数

通用的编译器独立方式在C/C++中实现UNUSED宏

在实现存根等时,您希望避免使用"未使用的变量"警告.多年来,我遇到过UNUSED()宏的一些替代方案,但从来没有一个被证明适用于"所有"编译器,或者标准是气密的.

或者我们为每个构建平台坚持使用#ifdef块?

编辑:由于非c兼容替代品的许多答案,我想澄清我正在寻找一个对C和C++,所有口味等都有效的定义.

c c++ macros compiler-warnings

16
推荐指数
1
解决办法
6369
查看次数

断言返回值,但以任何一种方式运行

通常,当我从集合中擦除元素时,我想声明它实际上已被擦除:即

assert(s.erase(e));
Run Code Online (Sandbox Code Playgroud)

但是当设置NDEBUG时,元素不会被删除.但如果我写

bool removed = s.erase(e);
assert(removed);
Run Code Online (Sandbox Code Playgroud)

编译器抱怨在设置NDEBUG时未使用'removed'.

我怎么能这样做?


我最后只是创建了一个实用工具方法:

inline void run_and_assert(bool b) {
    assert(b);
}
Run Code Online (Sandbox Code Playgroud)

现在我可以说

run_and_assert(s.erase(e));
Run Code Online (Sandbox Code Playgroud)

这有什么缺点吗?对我而言,这比luiscubal的解决方案更简单

c++ assert coding-style boolean-expression compiler-warnings

7
推荐指数
2
解决办法
234
查看次数