Так как я пришел в C из Java более высокого уровня, где у нас нет типизаторов типа const
, чтобы сделать тип неизменяемым, мы должны объявить все его члены окончательными и убедиться, что члены сами по себе неизменны.
По контракту, в C у нас есть тип-квиализатор const
.
Чтобы быть более конкретным, позвольте мне привести пример, с которым я сейчас застрял.У меня есть следующее
application.h
:
struct application_config_t{
int poll_interval;
int compression_ratio;
//other config parameters
};
struct application_t{ //This structure make me confused
void (*run_application)(struct application_t*);
void (*stop_application)(struct application_t*);
};
struct application_t* create_app(const struct application_config_t);
void release_app(struct application_t*);
Я не уверен, как определить структуру application_t
.Его единственная цель - выполнить актуальный запуск с run_application
и обработать SIGINT
с помощью stop_application
, чтобы выполнить постепенное отключение, а затем после stop_application
вернуться к вызову release_app(struct application_t*)
, чтобы освободить память.
У меня есть следующий случай на выбор:
I .Неизменный application_t
struct application_t{
void (*const run_application)(struct application_t*);
void (*const stop_application)(struct application_t*);
}
Я думаю, что это нормально, потому что созданное приложение не должно изменяться.Но создание такой неизменной структуры повлечет за собой memcpy
вызов в любом случае ...
II .Изменяемый application_t
при создании приложения будет объявлен как
const struct application_t* create_app(const struct application_config_t);
Это было бы хорошо, но я хочу освободить память, на которую указывает struct application_t*
после возврата stop_application
.Отпускание struct application_t*
означает, что appliaction_t
на самом деле не const
.И использование как
struct application_config_t cfg;
//...
const struct application_t *app_ptr = create_app(cfg);
(app_ptr -> run_application)(app_ptr);
release_app((struct application_t *) app_ptr); //const cast
потребует приведения против const
ness.