Указатель на функцию, которая принимает как аргументы const, так и non-const

62
3

Я хочу написать оболочку для чтения и записи функций unix, но read имеет параметр указателя const void и записывает простой указатель void в качестве параметра.

Итак, прототип, подобный этому, потерпит неудачу для одной из функций:

typedef ssize_t (*genericStreamHandler)(int, const void*, size);

спросил(а) 2015-10-03T12:13:00+03:00 5 лет, 8 месяцев назад
1
Решение
77

Не прототипируйте подпись функции, если код должен разрешать несовместимые функции.

Следующие компиляции без предупреждений/ошибок.

#include <stdio.h>

ssize_t file_read(int h, const void* b, int sz) {
if (b) return 0;
return h + sz;
}

ssize_t file_write(int h, void* b, int sz) {
if (b) return 0;
return h + sz;
}

//typedef ssize_t (*genericStreamHandler)(int, void*, int);
// v--- No function prototype
typedef ssize_t (*genericStreamHandler)();

int main(void) {
genericStreamHandler gFH1 = file_read;
genericStreamHandler gFH2 = file_write;
char buf[10];
return (*gFH1)(0, buf, 10) + (*gFH2)(0, buf, 10);
}

OTOH, лучший ответ может заключаться в принятии другого подхода, который не требует общего типа для сигнатур вариантов функций.

ответил(а) 2015-10-03T16:02:00+03:00 5 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема