none
Язык C, несоответствие сигнатуры указателя функции при обратном вызове RRS feed

  • Вопрос

  • Здравствуйте, подскажите пожалуйста, что Стандарт говорит о следующей ситуации.

    Есть функция, принимающая в качестве параметра указатель на функцию обратного вызова:

    void func(void (*const call_back_func)(const void *const _data));

    Данная функция принимает указатель на функцию, которая ничего не возвращает и принимает указатель на const void. Русским языком - функция обратного вызова не меняет _data указатель-параметр внутри своего тела, а так же не меняет данные, на которые указывает _data.

    Так вот, вопрос в том, что будет, если в качестве указателя передать в func() указатель на функцию, которая принимает void *const _data?

    Например:

    void call_back_func(void *const _data){}
    ...
    func(call_back_func);

    Ясное дело, что компилятор предупредит о несоответствии типа параметра (типа указателя на функцию обратного вызова). Но работать все будет.

    Это предупреждение - чисто косметическое, или на уровне компилятора может возникнуть неопределенное поведение?







    • Изменено MGNeo 17 апреля 2018 г. 10:24
    17 апреля 2018 г. 10:18

Ответы

  • Предупреждение не косметическое. Такой вызов функции приводит к преобразованию указателя на функцию  из одного типа в другой, не совместимый с исходным. Само по себе оно не запрещено, но последующий вызов функции по этому указателю ведет к неопределенному поведению.
    • Помечено в качестве ответа MGNeo 18 апреля 2018 г. 3:51
    17 апреля 2018 г. 19:37

Все ответы

  • Предупреждение не косметическое. Такой вызов функции приводит к преобразованию указателя на функцию  из одного типа в другой, не совместимый с исходным. Само по себе оно не запрещено, но последующий вызов функции по этому указателю ведет к неопределенному поведению.
    • Помечено в качестве ответа MGNeo 18 апреля 2018 г. 3:51
    17 апреля 2018 г. 19:37
  • Здравствуйте, подскажите пожалуйста, что Стандарт говорит о следующей ситуации.

    Скажите, а Вам не приходило в голову открыть, наконец, "Стандарт" самому, если Вас так сильно интересуют разные непредвиденные "ситуации"? Или требуется его перевод на русский язык?

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    17 апреля 2018 г. 19:55
  • Хотелось бы, конечно, почитать его на русском, потому что после чтения на английском возникает больше вопросов, чем ответов.
    18 апреля 2018 г. 3:50