相关疑难解决方法(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万
查看次数

如何禁用几行代码的GCC警告

在Visual C++中,可以使用#pragma warning (disable: ...).我还发现在GCC中你可以覆盖每个文件的编译器标志.我怎样才能为"下一行"做这个,或者使用GCC围绕代码区域推送/弹出语义?

c gcc pragma compiler-warnings

200
推荐指数
8
解决办法
12万
查看次数

在Release版本中使用assert()时避免使用未使用的变量警告

有时局部变量的唯一目的是在assert()中检查它,就像这样 -

int Result = Func();
assert( Result == 1 );
Run Code Online (Sandbox Code Playgroud)

在Release版本中编译代码时,通常会禁用assert(),因此此代码可能会生成有关Result已设置但从未读取的警告.

可能的解决方法是 -

int Result = Func();
if ( Result == 1 )
{
    assert( 0 );
}
Run Code Online (Sandbox Code Playgroud)

但它需要太多的打字,在眼睛上并不容易,并且导致总是检查条件(是的,编译器可以优化检查,但仍然).

我正在寻找一种替代方法来表达这个assert()的方式不会导致警告,但仍然易于使用并避免更改assert()的语义.

(在此区域代码中使用#pragma禁用警告不是一种选择,并且降低警告级别以使其消失也不是一种选择......).

c++ warnings assertions

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

抑制"未使用的变量x" - 警告的最佳方法是什么

抑制编译器(在本例中为gcc)的最佳/最佳方法是什么,如"未使用的变量x" - 警告?

我不想给gcc提供任何特定的标志来删除所有这些警告,仅用于特殊情况.

c gcc

52
推荐指数
5
解决办法
6万
查看次数

参数名称省略,C++ vs C.

在C++中,我倾向于在某些情况下省略参数的名称.但是在C中,当我省略参数的名字时出错了.

这是代码:

void foo(int);  //forward-decl, it's OK to omit the parameter's name, in both C++ and C

int main()
{
    foo(0);
    return 0;
}

void foo(int)  //definition in C, it cannot compile with gcc
{
    printf("in foo\n");
}

void foo(int)  //definition in C++, it can compile with g++
{
    cout << "in foo" << endl;
}
Run Code Online (Sandbox Code Playgroud)

这是为什么?我不能省略C函数定义中的参数名称吗?

c c++ compilation

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

如何使用clang使未使用的命令行参数错误静音而不禁用它?

-Werror与clang一起使用时,它会将"警告:编译期间未使用的参数"消息转换为错误,这是有道理的.有-Qunused-arguments一面旗帜让他们完全沉默.我的问题是,是否有一些-Wno-error=...我可以传递的标志,使这些不是错误,而不是完全禁用它们?

c clang

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

Variadic UNUSED函数/宏

抑制C编译器有关未使用变量的警告的一种众所周知的可移植方法是(参见C代码中未使用的参数警告):

#define UNUSED(x) (void)(x)
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来概括它以获取多个输入(不同类型):

void foo(int a, long b, void* c){

   /* Want this: */
   ALL_UNUSED(a, b, c);

   /* instead of: */
   UNUSED(a);
   UNUSED(b);
   UNUSED(c);
}
Run Code Online (Sandbox Code Playgroud)

似乎可以解决的一种方法是使用可变参数函数

static inline void ALL_UNUSED(int dummy, ...) {}
Run Code Online (Sandbox Code Playgroud)

但是,我怀疑这种解决方案在专家眼中是令人反感的.

是否有符合标准且可移植(即不使用__attribute__((unused)))的方式来制作可变参数UNUSED()函数/宏?非常感谢!

编辑

在C99或C预处理器的上下文中似乎没有一种干净的方式来执行我的要求.这就是人生.

在下面的回答中,@ Dabo展示了一种非常有趣的方式来做我要求使用的一系列宏.这是整洁和翔实的(至少对我来说),所以我接受这个答案.也就是说,我不会将它部署在一个大型项目中,因为它的篇幅足以超过它带来的好处(在我看来).但人们会在这里得出不同的结论.

如下所述,使用空可变参数函数的方法也不完美.虽然它是一个非常优雅的单行,但它会引发有关单元化变量的警告(如果是的话).此外,你必须相信你的编译器完全优化它,我原则上反对,但我尝试过的所有编译器实际上都是这样做的.

一个相关的情况是在早期高级接口设计阶段之后存根功能.那么你未使用的变量都将是函数参数并按定义初始化,以下方法可以正常工作

static inline void UNUSED(int dummy, ...) {}

void foo(int a, long b, void* c){
    UNUSED(a, b, b); /* No warnings */
}
Run Code Online (Sandbox Code Playgroud)

c macros c-preprocessor

11
推荐指数
1
解决办法
4008
查看次数

这句话在C中意味着什么:"(void)ptr;"

从标题中可能不清楚.我在嵌入式STM32项目中遇到了以下代码.我不明白函数里面的行.

    static void txend1(UARTDriver *uartp) {
        (void)uartp; // what does this do? Is it a statement?
    }
Run Code Online (Sandbox Code Playgroud)

我已经尝试在网上搜索其他地方,但大多数结果是指向void指针的指针,我不认为这是.谢谢您的帮助!

c embedded stm32

6
推荐指数
1
解决办法
251
查看次数

禁止未使用的变量警告

Fortran中抑制警告消息的最佳实践是什么,例如:

remark #7712: This variable has not been used.
Run Code Online (Sandbox Code Playgroud)

仅用于一个特定变量(API中我们不想破坏的想象函数)?

注意:我不想禁止显示文件的所有警告

注2:gcc的相似之处:__attribute__((__unused__))MACRO的其他常见C惯例

注意3:我对ifort尤其感兴趣,但是多编译器会更好。

warnings fortran unused-variables intel-fortran

5
推荐指数
1
解决办法
682
查看次数

什么是"(void)指针;" 用c ++表示?

有一些c ++代码

struct data {
    /* some fields */
};

typedef struct data * pData;

int function(pData pointer) {
    if(pointer == NULL)
        return ERROR;
    (void)pointer;
    /* other work */
}
Run Code Online (Sandbox Code Playgroud)

"(void)指针"是什么意思?

仅供参考,有一些int/char*/etc,一些函数指针在结构中用作回调函数.

c++ pointers

4
推荐指数
2
解决办法
480
查看次数