Добрый день!
Помогите, пожалуйста, с такой проблемой - есть у меня #define для одного значения-указателя размера:
#define MAXSIZE (1024) /* bytes */
...
//array declaration:
somearray[MAXSIZE];
В другом месте в коде есть такое место:
//data block
colourstable[256];
Я хочу сделать так:
//data block
colourstable[MAXSIZE / sizeof(Colour)];
Окей, работает. Точнее говоря я сделал вот-так, чтобы потом еще длину для циклов каждый раз не вычислять:
#define CTABLESIZE ((MAXSIZE) / sizeof(Colour))
...
colourstable[CTABLESIZE];
Теперь такой момент - эти colourstable и somearray сидят в одном union и somearray служит «выравнивателем» памяти, чтобы мне точно знать, сколько места занимает union. Не помню, как эта штуковина правильно называется - pad, padding, etc. Суть в том, что MAXSIZE может «гулять» в зависимости от версии (не так давно пришлось в два раза увеличить из-за другой структуры). Однако CTABLESIZE должен быть ровно 256. Ок, делаю так:
#define CTABLESIZE (UINT8_MAX + 1)
или
#define CTABLESIZE (1 << sizeof(char))
Так вот, поставил я такой CTABLESIZE, а потом завтра провожу ревизию\рефакторинг\какойдругойбулщит и у меня появляется радостная возможность уменьшить MAXSIZE до 80 байт. Радостно пишу #define MAXSIZE 80 и офигеваю от того, что размер union'а по прежнему 1024 из-за того, что я из-за своего старческого маразма забыл, что у меня где-то в другом модуле описана CTABLESIZE.
Поэтому основной вопрос чего хочу - как мне на этапе компиляции громко и матерно ругаться, что MAXSIZE меньше CTABLESIZE. Компилятор gcc, pure C.
Заранее спасибо, надеюсь подробно и понятно описал проблему.