реклама на сайте
подробности

 
 
> А как бы "феншуйно" использовать символы определяемые линкером?, или отключить warning: taking address of expression of type void
Шаманъ
сообщение Apr 25 2017, 18:46
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Приветствую всех!

Исходные данные:

Компоновщику (gnu ld) задаем некоторый символ. Например:
Код
-Xlinker --defsym -Xlinker __BUILD_DATE=0x$$(date +'%d%m%Y')

В итоге &__BUILD_DATE = 0x25042017, сегодня sm.gif

В программе использование такой штуки тривиально, например:
Код
extern void __BUILD_DATE;
..............
printf("Date: %X", (int)&__BUILD_DATE);


Теперь вопрос. Все работает давно, но согласно стандарту С конструкция написанная выше неправильная (ибо объект не может быть c типом void). Но в реальности по тому адресу ведь действительно ничего нет, т.е. в смысловом плане она соответствует реальности. Можно void заменить на uint8_t или что-то подобное, тогда конструкция будет правильная с точки зрения С, но неправильная в смысловом плане.

Хотелось бы узнать мнение у "знающих толк в извращениях" людей, как удовлетворить С и здравому смыслу sm.gif
P.S. Один вариант знаю, через неполный тип, вот так:
extern struct _void_ __BUILD_DATE;

но с этим вариантом не будет работать расширение GCC известное, как арифметика указателей. Для приведенного выше примера это не важно, но в более изощренных случаях это существенно.

Короче хочется лаконичности и перфекционизма sm.gif, ну на крайний случай можно было бы просто отключить warning: taking address of expression of type 'void', но похоже он не отключаемый избирательно.

Сообщение отредактировал Шаманъ - Apr 25 2017, 18:47
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Шаманъ
сообщение May 18 2017, 14:17
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



jcxz, тут больше вопрос не в том, как можно - сам знаю не один способ. Вариант с определением символов компоновщика вполне устраивает, просто программа написанная наиболее близко по смыслу не вписывается в стандарт С (хотя GCC все компилирует нормально, немного поругавшись).

Вопрос скорее из серии перфекционизма sm.gif
Go to the top of the page
 
+Quote Post
Baser
сообщение May 18 2017, 17:02
Сообщение #3


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(Шаманъ @ May 18 2017, 17:17) *
Вопрос скорее из серии перфекционизма sm.gif

Я бы сказал, что из серии крайнего перфекционизма.
Мне бы не пришло в голову над такими вещами задумываться, хотя считаюсь педантичным человеком в глазах окружающих sm.gif

Кстати, ИАР на такие конструкции смотрит благосклонно, не выдавая никаких варнингов:

ключ линкера
--define_symbol __BUILD_DATE=0x25042017

или строки скрипта линкера
define symbol __BUILD_DATE = 0x25042017;
export symbol __BUILD_DATE;

и в программе
extern void __BUILD_DATE;
...
printf("Date: %X", (int)&__BUILD_DATE);

Это потому, что в ИАР такие пользовательские символы линкера явно обрабатываются отдельно.
Компилятор же не позволит объявить неполный тип
void __BUILD_DATE;
А в случае пользовательского символа - пожалуйста, вот и нет предупреждений.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 12:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016