Приведение указателя функции к другому типу

Я недавно спросил об этой function-pointers же проблеме, касающейся некоторого pointer-to-function кода в GLib. (GLib - это pointer-to-function основная библиотека для проекта function-pointers GNOME, написанная на C.) Мне pointer-to-function сказали, что от нее зависит function-pointers вся структура slots'n'signals.

В function-pointers коде есть множество примеров pointer-to-function приведения типов (1) к (2):

  1. typedef int (*CompareFunc) (const void *a, const void *b)
  2. typedef int (*CompareDataFunc) (const void *b, const void *b, void *user_data)

Это pointer-to-function обычное дело для сквозных c вызовов с такими вызовами:

int stuff_equal (GStuff      *a,
                 GStuff      *b,
                 CompareFunc  compare_func)
{
    return stuff_equal_with_data(a, b, (CompareDataFunc) compare_func, NULL);
}

int stuff_equal_with_data (GStuff          *a,
                           GStuff          *b,
                           CompareDataFunc  compare_func,
                           void            *user_data)
{
    int result;
    /* do some work here */
    result = compare_func (data1, data2, user_data);
    return result;
}

Убедитесь function-pointers сами, здесь, в g_array_sort(): http://git.gnome.org/browse/glib/tree/glib/garray.c

Приведенные function-pointers выше ответы подробны и, вероятно, верны function-pointers - если вы входите в комитет по pointer-to-function стандартам. Адам и Йоханнес pointer-to-function заслуживают похвалы за их pointer-to-function хорошо исследованные ответы. Однако c в природе вы обнаружите, что function-pointers этот код отлично работает. Спорный? да. Учтите pointer-to-function это: GLib компилирует / работает function-pointers / тестирует на большом количестве c платформ (Linux / Solaris c / Windows / OS X) с широким c спектром компиляторов / компоновщиков pointer-to-function / загрузчиков ядра (GCC / CLang pointer-to-function / MSVC). Будь прокляты стандарты.

Некоторое pointer-to-function время я размышлял над этими pointer-to-function ответами. Вот мой вывод:

  1. Если вы пишете библиотеку обратного вызова, это может быть нормально. Caveat emptor - используйте на свой страх и риск.
  2. Иначе не делайте этого.

Если c подумать глубже после написания function-pointers этого ответа, я не удивлюсь, если pointer-to-function в коде компиляторов C используется function-pointers тот же трюк. И поскольку function-pointers (большинство / все?) Современные pointer-to-function компиляторы C загружаются, это function-pointers будет означать, что этот function-pointers трюк безопасен.

Более важный function-pointers вопрос для исследования: может pointer-to-function ли кто-нибудь найти платформу function-pointers / компилятор / компоновщик pointer-to-function / загрузчик, где этот трюк function-pointers не работает? Основные моменты pointer-to-function для этого. Бьюсь об заклад, есть c некоторые встроенные процессоры pointer-to-function / системы, которым это не pointer-to-function нравится. Однако для настольных pointer-to-function компьютеров (и, возможно, мобильных function-pointers устройств / планшетов) этот pointer-to-function трюк, вероятно, все еще работает.

c

function-pointers

2022-11-13T06:07:14+00:00