Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR пропустил одинаковое объявление переменной
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
misyachniy
При подчистке программы обнаружил, что переменная объявлена 2 раза, но компилятор пропустил без предупреждений.
Нажмите для просмотра прикрепленного файла

Я то стер одно объявление, но почему компилятор пропустил не понимаю.
scifi
При споре компилятора с человеком в 99% случаев прав оказывается компилятор. И приложенная картинка непонятно какое отношение к чему-либо вообще имеет :-)
SSerge
Где переменная?
Не вижу там ни одной переменной.
На картинке вообще перечень путей для поиска инклюдов.
psL
на картинке вообще эклипс. Затмение то есть wink.gif
scifi
Цитата(psL @ Nov 27 2014, 23:02) *
на картинке вообще эклипс. Затмение то есть wink.gif

О! Теперь всё приобрело смысл! :-)
misyachniy
Цитата(psL @ Nov 27 2014, 22:02) *
на картинке вообще эклипс. Затмение то есть wink.gif


Троллинг удался :-)
В предварительном просмотре сообщения не отображается картика.

Выкладываю правильную картинку.
По эклипсу тоже вопрос по поводу невозможности удаления путей.
Но он с другой оперы.
Dr.Alex
Кто тебе сказал, что это запрещено?
Если бы определения были разными, тогда была бы ошибка.
scifi
Цитата(Dr.Alex @ Nov 27 2014, 23:56) *
Кто тебе сказал, что это запрещено?
Если бы определения были разными, тогда была бы ошибка.

+1. Попробовал в gcc - тоже не ругается. А вот если инициализировать другим значением или объявить с другим типом - ругается. Компилятор всё правильно сделал, ящетаю.
Могу нанять юристов для прочтения спеки и написания научно обоснованного заключения, если бабла подкинете :-)
ViKo
В Keil, однако, такое не прокатило.
scifi
Цитата(ViKo @ Nov 28 2014, 00:12) *
В Keil, однако, такое не прокатило.

И этот компилятор всё правильно сделал, ящетаю. Другими словами, undefined behavior :-)
MrYuran
А теперь попробуйте разнести по разным файлам.
rolleyes.gif
ViKo
Цитата(MrYuran @ Nov 28 2014, 11:17) *
А теперь попробуйте разнести по разным файлам.
rolleyes.gif

xxxx.axf: Error: L6200E: Symbol xxx multiply defined (by xx.o and x.o).
MrYuran
Цитата(ViKo @ Nov 28 2014, 12:38) *
xxxx.axf: Error: L6200E: Symbol xxx multiply defined (by xx.o and x.o).

То есть, в пределах одной единицы компиляции при множественном объявлении образуется один объект, а если объявить в разных файлах - два, на которые потом ругается линкер.

Интересно, что будет при использовании флага -combine
ViKo
А сегодня в одном файле - прокатило. А-а-а!!!

Цитата(MrYuran @ Nov 28 2014, 11:42) *
Интересно, что будет при использовании флага -combine

Keil такого не принимает.
demiurg_spb
Цитата(MrYuran @ Nov 28 2014, 12:42) *
..если объявить в разных файлах - два, на которые потом ругается линкер.
Он может и не ругаться (во всяком случае по стандарту).
Более того он выделит под переменные из разных файлов с одинаковым именем общую память.
И можно очень весело проводить время, отлаживая проект из двух файлов, скажем такого содержания.
Код
int a;
и
Код
char a;

Именно для этого случая Си и предоставляет инструмент в виде ключевого слова static.
И если глобальная переменная внутри модуля не представлена в его интерфейсе (в заголовочном файле как extern), то она обязана иметь квалификатор static.
Всё остальное - просто неграмотно.

Цитата(ViKo @ Nov 28 2014, 12:53) *
Keil такого не принимает.
Естественно. Более того и для gcc это является атавизмом после появления ключика -flto.
MrYuran
Цитата(demiurg_spb @ Nov 28 2014, 13:27) *
Он может и не ругаться (во всяком случае по стандарту).
Более того он выделит под переменные из разных файлов с одинаковым именем общую память.

Обычно все-таки выкатывает error multiple definition
demiurg_spb
Цитата(MrYuran @ Nov 28 2014, 13:57) *

Только что проверил на gcc-4.7.2.
Съел молча проект из двух файлов, в каждом из которых было объявление int a;
И это ожидаемое поведение.
Сергей Борщ
Цитата(MrYuran @ Nov 28 2014, 11:57) *
Обычно все-таки выкатывает error multiple definition
Если компилировать в режиме C++. Для Сей это является допустимым.
misyachniy
Цитата(Сергей Борщ @ Nov 28 2014, 12:22) *
Если компилировать в режиме C++. Для Сей это является допустимым.


Хотелось, чтобы такие ошибки вылавливались компилятором.
В IAR есть MISRA.
Я никогда ее не использовал.

Есть ли чего обзорного почитать?
Сергей Борщ
Цитата(misyachniy @ Nov 29 2014, 09:59) *
Хотелось, чтобы такие ошибки вылавливались компилятором.
Включите режим C++ .

Про MISRA не знаю, но если там все так страшно, как здесь описывают - и знать не хочу. Сделать из C кастрированный бейсик - нет уж.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.