澄清函数调用

时间:2013-03-22 06:36:21

标签: android c pointers structure

我正在学习Android源代码。我想知道较低级别的函数如何从应用程序调用。

在这方面学习的同时,现在我正在努力理解我在下面给出的一个文件:

static int open_lights(const struct hw_module_t* module, char const* name,
        struct hw_device_t** device)
{
    int (*set_light)(struct light_device_t* dev,
            struct light_state_t const* state);

    if (0 == strcmp(LIGHT_ID_BACKLIGHT, name)) {
        set_light = set_light_backlight;
    }
    else if (0 == strcmp(LIGHT_ID_KEYBOARD, name)) {
        set_light = set_light_keyboard;
    }
    else if (0 == strcmp(LIGHT_ID_BUTTONS, name)) {
        set_light = set_light_buttons;
    }
    else if (0 == strcmp(LIGHT_ID_BATTERY, name)) {
        set_light = set_light_battery;
    }
    else if (0 == strcmp(LIGHT_ID_NOTIFICATIONS, name)) {
        set_light = set_light_notification;
    }
    else if (0 == strcmp(LIGHT_ID_ATTENTION, name)) {
        set_light = set_light_attention;
    }
    else {
        return -EINVAL;
    }

    pthread_once(&g_init, init_globals);

    struct light_device_t *dev = malloc(sizeof(struct light_device_t));
    memset(dev, 0, sizeof(*dev));

    dev->common.tag = HARDWARE_DEVICE_TAG;
    dev->common.version = 0;
    dev->common.module = (struct hw_module_t*)module;
    dev->common.close = (int (*)(struct hw_device_t*))close_lights;
    dev->set_light = set_light;

    *device = (struct hw_device_t*)dev;
    return 0;
}


set_light_backlight(struct light_device_t* dev,
        struct light_state_t const* state)
{
    int err = 0;
    int brightness = rgb_to_brightness(state);

    pthread_mutex_lock(&g_lock);
    err = write_int(LCD_FILE, brightness);
    pthread_mutex_unlock(&g_lock);

    return err;
}

我的问题是:

  1. int (*set_light)(struct light_device_t* dev, struct light_state_t const* state);这句话是什么意思?
  2. 我们只是将set_light_backlight分配给set_light。然后如何set_light_backlight(struct light_device_t* dev, struct light_state_t const* state) 函数被调用?

3 个答案:

答案 0 :(得分:1)

  

int( set_light)的含义是什么(struct light_device_t   dev,struct light_state_t const * state);

您需要了解函数指针是什么。

函数指针是一种指向函数的指针。取消引用时,它将调用它指向的函数并传递参数,就像正常的函数调用一样。

你的程序中有一个函数指针set_light

  • 输入int作为返回类型
  • 并采用struct light_device_t* and struct light_state_t const*
  • 类型的两个参数

在您的程序中,取决于名称包含的内容,您将指定函数指针指向运行时下面给定函数的任何一个

    set_light = set_light_backlight;

    set_light = set_light_keyboard;

    set_light = set_light_buttons;

    set_light = set_light_battery;

    set_light = set_light_notification;

    set_light = set_light_attention;
  

我们只是将set_light_backlight分配给set_light。那怎么可能呢   set_light_backlight(struct light_device_t * dev,struct light_state_t   const * state)函数被调用?

通过调用set_light()并使用所需参数调用函数set_light_backlight(),如果已为其分配set_light()

答案 1 :(得分:0)

  1. 这是声明一个名为set_light的函数指针。指针指向一个返回int的函数,并将两个结构作为参数。

  2. 您正在设置函数指针的值。其他人稍后会使用函数指针来调用该函数,而不需要知道实际函数是什么(这是函数指针的使用)。此方法通常称为“回调函数”。

答案 2 :(得分:0)

您引用的内容是Android模拟器中device-driver的{​​{1}}实现。因此,lights实际上是一个函数指针声明。这意味着int (*set_light)(struct light_device_t* dev, struct light_state_t const* state);是指向函数的指针,该函数在返回set_light值时采用light_device_t指针和light_state_t指针。

这是Android源代码树中的典型实现。这个实现用于具有潜在int个不同情况的通用实现,即基于一个案例,我可能想要调用一个不同的函数,但是我设置它的方式和我调用它的方式保持通用通过这种实施。

回到下一个问题,即调用它的位置。请参阅此source file。 在此文件中,设备设置为here,它将调用您引用的open方法。设置完成并返回n后,将在device方法中调用实际方法,如here所示。