Приветствую всех!
Исходные данные:
Компоновщику (gnu ld) задаем некоторый символ. Например:
Код
-Xlinker --defsym -Xlinker __BUILD_DATE=0x$$(date +'%d%m%Y')
В итоге &__BUILD_DATE = 0x25042017, сегодня

В программе использование такой штуки тривиально, например:
Код
extern void __BUILD_DATE;
..............
printf("Date: %X", (int)&__BUILD_DATE);
Теперь вопрос. Все работает давно, но согласно стандарту С конструкция написанная выше неправильная (ибо объект не может быть c типом void). Но в реальности по тому адресу ведь действительно ничего нет, т.е. в смысловом плане она соответствует реальности. Можно void заменить на uint8_t или что-то подобное, тогда конструкция будет правильная с точки зрения С, но неправильная в смысловом плане.
Хотелось бы узнать мнение у "знающих толк в извращениях" людей, как удовлетворить С и здравому смыслу

P.S. Один вариант знаю, через неполный тип, вот так:
extern struct _void_ __BUILD_DATE;
но с этим вариантом не будет работать расширение GCC известное, как арифметика указателей. Для приведенного выше примера это не важно, но в более изощренных случаях это существенно.
Короче хочется лаконичности и перфекционизма

, ну на крайний случай можно было бы просто отключить warning: taking address of expression of type 'void', но похоже он не отключаемый избирательно.
Сообщение отредактировал Шаманъ - Apr 25 2017, 18:47