GCC 在有效 stb_image.h 上产生错误
GCC produces errors on valid stb_image.h
以下显示了 GCC 生成的两个错误:
In file included from /home/omar/Desktop/Lovelace/src/main.cpp:22:
/home/omar/Desktop/Lovelace/include/stb/stb_image.h: In function ‘void* stbi__load_gif_main(stbi__context*, int**, int*, int*,
int*, int*, int)’:
/home/omar/Desktop/Lovelace/include/stb/stb_image.h:6778:11: **error: variable ‘out_size’ set but not used** [-Werror=unused-but-set-variable]
6778 | int out_size = 0;
| ^~~~~~~~
/home/omar/Desktop/Lovelace/include/stb/stb_image.h:6779:11: **error: variable ‘delays_size’ set but not used** [-Werror=unused-but-set-variable]
6779 | int delays_size = 0;
| ^~~~~~~~~~~
cc1plus: all warnings being treated as errors
make[2]: *** [CMakeFiles/lovelace.dir/build.make:102: CMakeFiles/lovelace.dir/src/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/lovelace.dir/all] Error 2
make: *** [Makefile:84: all] Error 2
不过似乎没有任何问题,因为确实使用了变量:
int out_size = 0;
int delays_size = 0;
memset(&g, 0, sizeof(g));
if (delays) {
*delays = 0;
}
do {
u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
if (u == (stbi_uc *) s) u = 0; // end of animated gif marker
if (u) {
*x = g.w;
*y = g.h;
++layers;
stride = g.w * g.h * 4;
if (out) {
void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride );
if (NULL == tmp) {
STBI_FREE(g.out);
STBI_FREE(g.history);
STBI_FREE(g.background);
return stbi__errpuc("outofmem", "Out of memory");
}
else {
out = (stbi_uc*) tmp;
out_size = layers * stride;
}
if (delays) {
*delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers );
delays_size = layers * sizeof(int);
}
} else {
out = (stbi_uc*)stbi__malloc( layers * stride );
out_size = layers * stride;
if (delays) {
*delays = (int*) stbi__malloc( layers * sizeof(int) );
delays_size = layers * sizeof(int);
}
} int out_size = 0;
这是编译器错误吗?
编辑:GCC 版本为 9.3.0
OS: Linux 最新的
似乎使用 stbi__load_gif_main(...)
时会生成警告。这不是编译器的错,也不是你的错。
我重现了这个并得到了相同的结果。
无需深入探究原因,您可以通过编译 不带 标志 -Werror
.
来解决此问题
任何可以首先填写为什么会出现警告的人,请填写。
代码初始化和修改 out_size
和 delay_size
但不使用它们(它们只被写入,从不被读取)。它 出现 的地方是 STBI_REALLOC_SIZED()
调用,但 STBI_REALLOC_SIZED
是一个定义如下的宏:
#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
所以 oldsz
未使用。
不使用 -Wunused-variable
(或暗示这一点的 -W
选项之一)和 -Werror
的编译是一个不令人满意的解决方案,因为它会抑制您自己的代码中可能需要的警告.如果这是正常的库代码而不是 header 中的静态函数(这本身就是一件令人讨厌的事情),那么您可以使用与您自己的代码不同的选项编译 third-party 代码。最简单的解决方案是修改 stb_image.h 文件,使其具有:
int out_size = 0; out_size = out_size ;
int delays_size = 0; delays_size = delays_size ;
或
int out_size = 0; (void)out_size ;
int delays_size = 0; (void)delays_size ;
事实证明 header 已经有一个宏:
int out_size = 0; STBI_NOTUSED(out_size) ;
int delays_size = 0; STBI_NOTUSED(delays_size) ;
这将以一种没有实际效果且可以优化的方式“使用”变量(尽管如果您选择使用这种对 header 文件的可怕滥用,显然这不是问题) .虚拟使用会抑制警告。
通常您可能不想将 header 更改为 third-party 库,但在这种情况下 header 是 库因此,如果说它是共享 object 库的 header,就不会有不一致的风险。所有使用它的代码都可以看到更改。唯一的问题是,如果您采用更新版本,您可能必须 re-implement 修复。一种解决方案是向作者提交更改请求,这样每个人的问题都会消失。
@Cliffort 在他的回答中写的一切都是正确的,但是(使用 gcc)而不是 (void)
,这很难搜索,因为它也会显示没有参数的函数,我会使用
int aUnused __attribute__((unused));
当我看到代码时,它是不言自明的,而且很容易搜索。
(void) 有时会产生一些副作用,例如如果 variable
为 volatile
则为 (void)variable
生成无效代码
以下显示了 GCC 生成的两个错误:
In file included from /home/omar/Desktop/Lovelace/src/main.cpp:22:
/home/omar/Desktop/Lovelace/include/stb/stb_image.h: In function ‘void* stbi__load_gif_main(stbi__context*, int**, int*, int*,
int*, int*, int)’:
/home/omar/Desktop/Lovelace/include/stb/stb_image.h:6778:11: **error: variable ‘out_size’ set but not used** [-Werror=unused-but-set-variable]
6778 | int out_size = 0;
| ^~~~~~~~
/home/omar/Desktop/Lovelace/include/stb/stb_image.h:6779:11: **error: variable ‘delays_size’ set but not used** [-Werror=unused-but-set-variable]
6779 | int delays_size = 0;
| ^~~~~~~~~~~
cc1plus: all warnings being treated as errors
make[2]: *** [CMakeFiles/lovelace.dir/build.make:102: CMakeFiles/lovelace.dir/src/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/lovelace.dir/all] Error 2
make: *** [Makefile:84: all] Error 2
不过似乎没有任何问题,因为确实使用了变量:
int out_size = 0;
int delays_size = 0;
memset(&g, 0, sizeof(g));
if (delays) {
*delays = 0;
}
do {
u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
if (u == (stbi_uc *) s) u = 0; // end of animated gif marker
if (u) {
*x = g.w;
*y = g.h;
++layers;
stride = g.w * g.h * 4;
if (out) {
void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride );
if (NULL == tmp) {
STBI_FREE(g.out);
STBI_FREE(g.history);
STBI_FREE(g.background);
return stbi__errpuc("outofmem", "Out of memory");
}
else {
out = (stbi_uc*) tmp;
out_size = layers * stride;
}
if (delays) {
*delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers );
delays_size = layers * sizeof(int);
}
} else {
out = (stbi_uc*)stbi__malloc( layers * stride );
out_size = layers * stride;
if (delays) {
*delays = (int*) stbi__malloc( layers * sizeof(int) );
delays_size = layers * sizeof(int);
}
} int out_size = 0;
这是编译器错误吗?
编辑:GCC 版本为 9.3.0
OS: Linux 最新的
似乎使用 stbi__load_gif_main(...)
时会生成警告。这不是编译器的错,也不是你的错。
我重现了这个并得到了相同的结果。
无需深入探究原因,您可以通过编译 不带 标志 -Werror
.
任何可以首先填写为什么会出现警告的人,请填写。
代码初始化和修改 out_size
和 delay_size
但不使用它们(它们只被写入,从不被读取)。它 出现 的地方是 STBI_REALLOC_SIZED()
调用,但 STBI_REALLOC_SIZED
是一个定义如下的宏:
#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
所以 oldsz
未使用。
不使用 -Wunused-variable
(或暗示这一点的 -W
选项之一)和 -Werror
的编译是一个不令人满意的解决方案,因为它会抑制您自己的代码中可能需要的警告.如果这是正常的库代码而不是 header 中的静态函数(这本身就是一件令人讨厌的事情),那么您可以使用与您自己的代码不同的选项编译 third-party 代码。最简单的解决方案是修改 stb_image.h 文件,使其具有:
int out_size = 0; out_size = out_size ;
int delays_size = 0; delays_size = delays_size ;
或
int out_size = 0; (void)out_size ;
int delays_size = 0; (void)delays_size ;
事实证明 header 已经有一个宏:
int out_size = 0; STBI_NOTUSED(out_size) ;
int delays_size = 0; STBI_NOTUSED(delays_size) ;
这将以一种没有实际效果且可以优化的方式“使用”变量(尽管如果您选择使用这种对 header 文件的可怕滥用,显然这不是问题) .虚拟使用会抑制警告。
通常您可能不想将 header 更改为 third-party 库,但在这种情况下 header 是 库因此,如果说它是共享 object 库的 header,就不会有不一致的风险。所有使用它的代码都可以看到更改。唯一的问题是,如果您采用更新版本,您可能必须 re-implement 修复。一种解决方案是向作者提交更改请求,这样每个人的问题都会消失。
@Cliffort 在他的回答中写的一切都是正确的,但是(使用 gcc)而不是 (void)
,这很难搜索,因为它也会显示没有参数的函数,我会使用
int aUnused __attribute__((unused));
当我看到代码时,它是不言自明的,而且很容易搜索。
(void) 有时会产生一些副作用,例如如果 variable
为 volatile
(void)variable
生成无效代码