JDL*_*aha 6 c parameter-passing
我正在使用 C 来构建卵石表盘。我遇到了一个错误parameter 'light_bitmap' set but not used [-Werror=unused-but-set-parameter]。然而,该变量在我的函数中使用。我不确定这条消息是什么意思。以下是我拥有的代码:
在标题声明中:
void backlight_subscribe(GBitmap *light_bitmap, int start_hour, int end_hour);
Run Code Online (Sandbox Code Playgroud)
在定义 .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);
}
}
Run Code Online (Sandbox Code Playgroud)
在 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();
}
Run Code Online (Sandbox Code Playgroud)
完整的错误信息:
[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
Run Code Online (Sandbox Code Playgroud)
有没有人看到我做错了什么?
正如错误所示,在您的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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你像这样调用该函数:
backlight_subscribe(&light_bitmap, 22, 8);
Run Code Online (Sandbox Code Playgroud)
附带说明一下,函数参数light_bitmap屏蔽了同名的全局变量。这可能会引起混乱,因此请尽量避免这种情况。