5

-前提:

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

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

function 'xxx' was declared but never referenced

头文件中的类似问题,它有一些静态函数,仅在一个 c 文件中使用,但许多其他 c 文件包含此头文件。

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

--------问题如下图-----------

我目前构建了一些由供应商提供的代码,其中包含很多警告,因为我想要一个无警告构建,因此,我把-Werrorforgcc--diag_error=[error_ref_number]for armcc.

经过以上makefile修改后,我目前遇到的最多警告是

variable 'xxx' was declared but never referenced

它是由以下编码风格引起的:

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

static const int a = 10;
static const int b = 20;
static const int c = 30;
...
static const int z = xx;

但是,许多 c 文件都包含这个 BIG 头文件,但这些 c 文件中只有一个使用上述变量之一,它喜欢a.c使用变量ab.c使用变量b等。

我有两种修复方法:

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

  2. 单独的头文件,意味着我创建a.h, b.h, ..., z.h,并且每个专用 c 文件仅包含上述头文件中的一个

但是,这两种方式对我的工作都有限制,

方式1

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

方式2

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

如果有任何想法来克服这个问题?

更新

我可以临时使用Wno-xxxforgcc并删除一些[error_ref_number]in 标志--diag_error(例如CFLAG += --diag_error=550,223,188,177,....,,我删除177for pass this warning in armcc)并使我的编译继续并首先修复其他警告,但我确实需要修复所有警告。

4

3 回答 3

2

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

如果您发现警告令人讨厌,只需在编译期间添加 -Wno-unused-variable 标志。

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

我知道的几乎所有开源项目都会有未引用的变量,而且我没有看到任何人付出太多努力来消除它。

再次编辑:好的,我看到您需要免费的绝对警告。好吧,我能想到的唯一需要您减少工作时间的解决方案是使用#define 宏。

您在头文件中制作#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

你的 Ac 文件看起来像这样:

#define __A__
#define __EXTRA__
#include "BigHeader.h"
.....

glext.h 如何为 OpenGL 工作。这比分解成许多较小的头文件要好,因为您可以使用 MACROS 清楚地看到依赖关系,而大量文件将需要您制作好的文档。而且宏比文件更灵活。

如果您可以与您提到的供应商协商,让他们始终告诉您他们所做的不同,那将是很好的,您可以将它们添加到正确的位置。如果您不能只保留原始 VeryBIG.h 的历史记录并使用差异工具检查新版本的更改。

于 2014-01-03T06:47:05.277 回答
1

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

在你的鞋子里,我可能会写一些自动分解的脚本;那么当新版本发生时,我就不必再做一遍了。

于 2014-01-03T07:05:51.800 回答
0

你能写吗?

static_assert(x == x);

或者

assert(x == x);

这些在编译时被删除。

于 2021-10-13T04:01:30.253 回答