LINUX.ORG.RU

История изменений

Исправление 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;
}