В моем коде C89 у меня есть несколько модулей, реализующих множество абстрактных буферов, которые должны обрабатываться пользователем, как если бы они были классами. То есть есть заголовок publi c, определяющий функции взаимодействия, и это все, что пользователь когда-либо видит. Они не предназначены (не должны) знать, что происходит за кулисами.
Однако при создании буфера необработанный байтовый буфер передается в функцию создания, поэтому пользователь должен иметь возможность знать сколько необработанного буферного пространства выделить во время компиляции. Для этого необходимо знать, сколько места занимает один элемент в каждом абстрактном типе. Мы пишем код для очень ограниченной встроенной среды.
В настоящее время каждый тип буфера имеет частный заголовок, в котором структура определяет формат данных. Просто добавить макрос для размера элемента данных:
#define MY_ELEMENT_SIZE (sizeof(component_1_type) + sizeof(component_2_type))
Однако component_x_type
предназначен для скрытия от пользователя, поэтому это определение не может go в publi c заголовок с прототипами для интерфейсных функций.
Наша следующая идея заключалась в том, чтобы иметь переменную const
в источнике:
const int MY_ELEMENT_SIZE = sizeof(component_1_type) + sizeof(component_2_type);
и объявление extern
в publi c header:
extern const int MY_ELEMENT_SIZE;
Но поскольку это C89 и у нас есть педантизм, MISRA и другие требования, которые необходимо выполнить, мы не можем использовать массивы переменной длины. В «пользовательском» исходном файле, чтобы получить необработанный буфер из 50 элементов, мы пишем:
char rawBuffer[50 * MY_ELEMENT_SIZE] = {0u};
Использование метода extern const...
приводит к ошибке компиляции:
error: variably modified ‘rawBuffer’ at file scope
Это не было полностью неожиданным, но разочаровывает то, что sizeof(any_type)
действительно постоянен и известен во время компиляции.
Пожалуйста, посоветуйте мне, как раскрыть размер элемента данных в publi c заголовок, не сообщая пользователю о существовании component_x_type
, таким образом, чтобы его можно было использовать как длину массива в C89.
Большое, большое спасибо.