История изменений
Исправление goto-vlad, (текущая версия) :
Можно объявить указатель на функцию константным:
#include <stdio.h>
typedef struct {
void (*const say)(void);
} Animal;
static void SayCat(void) {
printf("Meow");
}
static void SayDog(void) {
printf("Wof");
}
static Animal newCat(void) {
Animal animal = {
.say = SayCat
}; // нет ошибки, ссылка гарантировано заполнена
return animal;
}
static Animal newDog(void) {
Animal animal;
// gcc: assignment of read-only member ‘say’
// clang: cannot assign to non-static data member 'say' with const-qualified type 'void (*const)(void)'
animal.say = SayDog;
return animal;
}
Исходная версия goto-vlad, :
Можно объявить указатель на функцию константным:
#include <stdio.h>
typedef struct {
void (*const say)(void);
} Animal;
static void SayCat(void) {
printf("Meow");
}
static void SayDog(void) {
printf("Wof");
}
static Animal newCat(void) {
Animal animal = {
.say = SayCat
}; // нет ошибки, ссылка гарантировано заполнена
return animal;
}
static Animal newDog(void) {
Animal animal; // ошибка компилятора - создана структура без гарантии заполнения ссылки
// gcc: assignment of read-only member ‘say’
// clang: cannot assign to non-static data member 'say' with const-qualified type 'void (*const)(void)'
animal.say = SayDog;
return animal;
}