Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C “解决问题的最佳方法”;变量';xxx和x27;已声明但从未引用;_C_Gcc_Makefile_Warnings_Armcc - Fatal编程技术网

C “解决问题的最佳方法”;变量';xxx和x27;已声明但从未引用;

C “解决问题的最佳方法”;变量';xxx和x27;已声明但从未引用;,c,gcc,makefile,warnings,armcc,C,Gcc,Makefile,Warnings,Armcc,-前提条件: 我知道有很多方法可以忽略此警告,但我确实需要修复它,但不只是为编译器添加一些标志来忽略它,因为我可以在本地执行此makefileCFLAG修改,但由于公司质量控制原因,编译/构建策略无法更改。这个问题我只想讨论一下谁能很好地解决它,但不要忽视它们,非常感谢 同时,不仅有些变量从未被引用过,而且还有警告: function 'xxx' was declared but never referenced 在头文件中也存在类似的问题,它有一些静态函数,这些函数只在一个c文件中使用,但其

-前提条件:

我知道有很多方法可以忽略此警告,但我确实需要修复它,但不只是为编译器添加一些标志来忽略它,因为我可以在本地执行此makefile
CFLAG
修改,但由于公司质量控制原因,编译/构建策略无法更改。这个问题我只想讨论一下谁能很好地解决它,但不要忽视它们,非常感谢

同时,不仅有些变量从未被引用过,而且还有警告:

function 'xxx' was declared but never referenced
在头文件中也存在类似的问题,它有一些静态函数,这些函数只在一个c文件中使用,但其他许多c文件都包含此头文件

此外,此代码在专用目标上运行,该目标具有关键内存消耗,这意味着我需要处理ROM和RAM中的每一位。

----问题如下所示-----

我目前构建了一些由供应商提供的代码,其中包含很多警告,因为我想拥有一个无警告的构建,因此,我为
gcc
放置了
-Werror
,为
armcc
放置了
-diag\u error=[error\u ref\u number]

在上述makefile修改之后,我目前遇到的最大警告是

variable 'xxx' was declared but never referenced
这是由以下编码风格引起的:

veryBIG.h
中,它定义了一些变量,如(仅举个例子,但供应商的代码具有完全相同的方式):

然而,许多c文件都包含这个大头文件,但这些c文件中只有一个使用上述变量之一,如
a.c
将使用变量
a
b.c
使用变量
b
,等等

我有两种解决方法:

  • 将这些变量移到它的专用c文件中,这意味着头文件将变得无用

  • 单独的头文件,意味着我创建了
    a.h
    b.h
    ,…,
    z.h
    ,并且每个专用的c文件只包括头文件中的一个

  • 但是这两种方式对我的工作都有局限性

    方式1

    我不确定供应商的进一步更新是否会将此头文件更改为what或具有一些更新值,因为供应商不想修复此编译警告,这意味着如果我按照方式1进行操作,如果供应商更改了这些变量,我将手动更新这些变量(仅在头文件中,并且我必须将它们同步到c文件)这种方式使我进一步的合并工作变得复杂

    方式2

    这也使得我的进一步合并工作变得不容易,因为我不使用供应商的方式,而且如果这些头文件不在同一文件夹中(路径已经为该
    veryBIG.h
    定义),我还需要修改系统makefile以适应这些头文件到
    INC
    路径中

    有没有办法克服这个问题

    更新


    我可以临时使用
    Wno xxx
    用于
    gcc
    并删除标志
    --diag\u error
    中的一些
    [error\u ref\u number]
    (如
    CFLAG+=--diag\u error=550223188177,
    ,我删除
    177
    以在
    armcc
    中传递此警告),并使我的编译继续进行,首先修复其他警告,但是我确实需要修复所有警告。

    AFAIK,警告变量'xxx'已声明,但从未被引用对于现代设备而言,没有任何风险。唯一的威胁是,当程序加载时,变量可能会占用一点内存空间,即使是最小的现代机器也不会因为这一点内存浪费而遭受OOM。顺便说一句,现代编译器会为您优化它,为什么不呢?因为编译器已经警告过您了。你可以忽略这个警告

    如果您觉得警告很烦人,只需在编译期间添加-Wno unused变量标志

    编辑:正如亚历克斯在评论中所说,我错了。但是你可以看到,即使是我提到的那个小风险也是假的。所以放松点

    我所知道的几乎所有开源项目都会有未引用的变量,我看不到有人会花太多精力来消除这些变量

    再次编辑:好的,我发现您需要绝对无警告。我能想到的唯一解决方案是使用#define macros,它需要更少的工作时间

    在头文件中创建#ifdef/#else/#endif块,并在C文件中添加#defines。但是你仍然需要花费大量的时间来找出依赖关系

    您的头文件如下所示:

    #ifdef __A__
    static const int var_used_in_A;
    #endif
    #ifdef __B__
    static const int var_used_in_B;
    #endif
    #ifdef __EXTRA__
    static const int var_used_in_both;
    #endif
    
    #define __A__
    #define __EXTRA__
    #include "BigHeader.h"
    .....
    
    您的A.c文件将如下所示:

    #ifdef __A__
    static const int var_used_in_A;
    #endif
    #ifdef __B__
    static const int var_used_in_B;
    #endif
    #ifdef __EXTRA__
    static const int var_used_in_both;
    #endif
    
    #define __A__
    #define __EXTRA__
    #include "BigHeader.h"
    .....
    
    这就是glext.h在OpenGL中的工作原理。这比分解成许多较小的头文件要好,因为您可以通过宏清楚地看到依赖关系,而许多文件需要您编写良好的文档。宏比文件更灵活


    如果你能与你提到的供应商谈判,让他们总是告诉你他们所做的改变,那就太好了,你可以把它们添加到正确的地方。如果您不能只保留原始VeryBIG.h的历史记录,并使用diff工具检查新版本的更改。

    如果您关心内存使用,以至于每一位都很重要,那么您可能应该将该头文件分解为许多小块,因为没有实际保证编译器不会在每个
    .c
    文件中反复发出这些
    静态
    变量和函数中的每一个,即使只使用了其中的一小部分。(好像规则说编译器可以删除所有未使用的静态数据,但没有规定必须删除。)


    站在你的立场上,我可能会写一些脚本,自动完成分手;这样,当新版本发布时,我就不必从头再来了。

    在您的makefile中取消此类警告是否可以接受?使用-Wno未使用-variable@tristan现在的