У меня есть 100 структур, которые выглядят примерно так:
struct s00 { char data[30]; };
struct s01 { char data[30]; };
struct s02 { int data[10]; };
struct s03 { double data[5]; };
struct s04 { float data[20]; };
struct s05 { short data[15]; };
struct s06 { char data[7]; };
struct s07 { int data[19]; };
struct s08 { double data[11]; };
struct s09 { float data[5]; };
struct s10 { char data[52]; };
//...
struct s99 { char data[12]; };
typedef struct s00 s00;
typedef struct s01 s01;
typedef struct s02 s02;
//...
typedef struct s99 s99;
Я хочу найти самый большой sizeof
из этих структур во время компиляции.Я попытался использовать макрос сравнения следующим образом:
#define LARGER(a, b) ((a) > (b) ? (a) : (b))
, а затем использовал его для создания окончательного определения, которое будет содержать результат:
#define MAX_SIZEOF (LARGER(sizeof(s00), \
LARGER(sizeof(s01), \
LARGER(sizeof(s02), \
LARGER(sizeof(s03), \
LARGER(sizeof(s04), \
LARGER(sizeof(s05), \
LARGER(sizeof(s06), \
LARGER(sizeof(s07), \
LARGER(sizeof(s08), \
LARGER(sizeof(s09), \
LARGER(sizeof(s10), \
//...
sizeof(s99))) /*...*/ ))
Однако компилятору не хватает места:
Ошибка Компилятор C1060 находится вне пространства кучи
Это имеет смысл, учитывая, что этот #define
должен отслеживать множество чисел, поскольку он просто заменяеттекст.В частности, число целых чисел, найденных в MAX_SIZEOF
, является экспоненциальным и может быть описано как:
, где x равно количеству структуручаствует.Предполагая 4 байта для целого числа, компилятору потребуется выделить 30,4 терабайта секстиллиона для вычисления этого макроса (если мои вычисления верны).Максимум, что моя система могла обработать, было 17 структур (786430 номеров, 3,14 мегабайта).
Я не уверен, как найти эффективное решение в C.
В C ++ я мог бы добиться этого с помощью constexpr
довольно легко, без каких-либо проблем с компиляцией:
constexpr size_t LARGER(size_t a, size_t b) {
return a > b ? a : b;
}
constexpr size_t MAX_SIZEOF() {
return
LARGER(sizeof(s00), \
LARGER(sizeof(s01), \
LARGER(sizeof(s02), \
LARGER(sizeof(s03), \
LARGER(sizeof(s04), \
LARGER(sizeof(s05), \
LARGER(sizeof(s06), \
LARGER(sizeof(s07), \
LARGER(sizeof(s08), \
LARGER(sizeof(s09), \
LARGER(sizeof(s10), \
//...
sizeof(s99))/*...*/)));
Но да, я должен использовать C только здесь.... Спасибо за любые идеи!