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