C 参数设置但未使用

标签 c parameter-passing

我正在使用 C 构建卵石表盘。我遇到了错误 parameter 'light_bitmap' set but not used [-Werror=unused-but-set-parameter]。但是,我的函数中使用了该变量。我不确定这条消息是什么意思。下面是我的代码:

在 header 声明中:

void backlight_subscribe(GBitmap *light_bitmap, int start_hour, int end_hour);

在定义 .c 中:

void backlight_subscribe(GBitmap *light_bitmap, int start_hour, int end_hour) {
    int hour = get_current_hour();
    if((hour >= start_hour) || (hour < end_hour)) {
        accel_tap_service_subscribe(tap_handler);
        light_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_LIGHT_ON_ICON);
    } else {
        accel_tap_service_unsubscribe();
        light_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_LIGHT_OFF_ICON);
    }
}

在 main.c 中:

static GBitmap *light_bitmap;
...
static void window_load(Window *window) {
     ...
     backlight_subscribe(light_bitmap, 22, 8);
     ...
}

static void init(void) {
    s_main_window = window_create();
    window_set_window_handlers(s_main_window, (WindowHandlers) {
        .load = window_load,
        .unload = window_unload,
    });
    window_stack_push(s_main_window, false); 
}

...

int main(void) {
    init();
    app_event_loop();
    deinit();
}

完整错误信息:

[16/28] c: src/accel_sensor.c -> build/src/accel_sensor.c.16.o
../src/accel_sensor.c: In function 'backlight_subscribe':
../src/accel_sensor.c:22:35: error: parameter 'light_bitmap' set but not used [-Werror=unused-but-set-parameter]
 void backlight_subscribe(GBitmap *light_bitmap, int start_hour, int end_hour) {
                                   ^
cc1: all warnings being treated as errors
Waf: Leaving directory `/home/adminuser/pebble/pebble-app/watchface/build'
Build failed

有人能看出我哪里做错了吗?

最佳答案

正如错误所说,在您的 backlight_subscribe 函数中,您正在为 light_bitmap 分配一个值,但您没有从中读取。这意味着它没有被使用。

在C语言中,所有参数都是按值传递的。因此,您分配给 light_bitmap 的值仅在该函数中可见。如果您打算更改传入的变量,则需要传入相关变量的地址,更改函数以接受指向该变量的指针,然后在分配给它时取消引用该指针:

void backlight_subscribe(GBitmap **light_bitmap, int start_hour, int end_hour) {
    int hour = get_current_hour();
    if((hour >= start_hour) || (hour < end_hour)) {
        accel_tap_service_subscribe(tap_handler);
        *light_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_LIGHT_ON_ICON);
    } else {
        accel_tap_service_unsubscribe();
        *light_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_LIGHT_OFF_ICON);
    }
}

然后你像这样调用这个函数:

backlight_subscribe(&light_bitmap, 22, 8);

作为旁注,函数参数 light_bitmap 屏蔽了同名的全局变量。这可能会造成混淆,因此请尽量避免这种情况。

关于C 参数设置但未使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35324934/

相关文章:

c++ - 查询内存位置

java - 从 Java 将参数传递给 VBS

lua - lua返回参数

c - 如何在汇编中访问结构体的元素?

c - c语言,编译时错误多个未排序的修改[-Werror,-Wunsequenced]

c - 文件操作复制一个 .mp3 文件以创建另一个相同的文件

MSBuild 将参数传递给 CallTarget

C++将参数传递给带有多个感叹号的主函数

powershell - 参数 ValueFromPipeline 和更改位置

c - 为什么编译器将字符视为整数?