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

 
 
> IAR пропустил одинаковое объявление переменной
misyachniy
сообщение Nov 27 2014, 17:37
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



При подчистке программы обнаружил, что переменная объявлена 2 раза, но компилятор пропустил без предупреждений.
Прикрепленное изображение


Я то стер одно объявление, но почему компилятор пропустил не понимаю.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MrYuran
сообщение Nov 28 2014, 08:17
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



А теперь попробуйте разнести по разным файлам.
rolleyes.gif


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 28 2014, 08:38
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(MrYuran @ Nov 28 2014, 11:17) *
А теперь попробуйте разнести по разным файлам.
rolleyes.gif

xxxx.axf: Error: L6200E: Symbol xxx multiply defined (by xx.o and x.o).
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 28 2014, 08:42
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

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

Интересно, что будет при использовании флага -combine


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 28 2014, 09:27
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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

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

Цитата(ViKo @ Nov 28 2014, 12:53) *
Keil такого не принимает.
Естественно. Более того и для gcc это является атавизмом после появления ключика -flto.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 28 2014, 09:57
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

Обычно все-таки выкатывает error multiple definition


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 28 2014, 10:22
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(MrYuran @ Nov 28 2014, 11:57) *
Обычно все-таки выкатывает error multiple definition
Если компилировать в режиме C++. Для Сей это является допустимым.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
misyachniy
сообщение Nov 29 2014, 07:59
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



Цитата(Сергей Борщ @ Nov 28 2014, 12:22) *
Если компилировать в режиме C++. Для Сей это является допустимым.


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

Есть ли чего обзорного почитать?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- misyachniy   IAR пропустил одинаковое объявление переменной   Nov 27 2014, 17:37
- - scifi   При споре компилятора с человеком в 99% случаев пр...   Nov 27 2014, 19:40
- - SSerge   Где переменная? Не вижу там ни одной переменной. ...   Nov 27 2014, 19:52
- - psL   на картинке вообще эклипс. Затмение то есть   Nov 27 2014, 20:02
|- - scifi   Цитата(psL @ Nov 27 2014, 23:02) на карти...   Nov 27 2014, 20:42
|- - misyachniy   Цитата(psL @ Nov 27 2014, 22:02) на карти...   Nov 27 2014, 20:46
|- - Dr.Alex   Кто тебе сказал, что это запрещено? Если бы опреде...   Nov 27 2014, 20:56
|- - scifi   Цитата(Dr.Alex @ Nov 27 2014, 23:56) Кто ...   Nov 27 2014, 21:00
- - ViKo   В Keil, однако, такое не прокатило.   Nov 27 2014, 21:12
|- - scifi   Цитата(ViKo @ Nov 28 2014, 00:12) В Keil,...   Nov 27 2014, 21:17
|- - demiurg_spb   Цитата(MrYuran @ Nov 28 2014, 13:57) Тол...   Nov 28 2014, 10:03
|- - Сергей Борщ   Цитата(misyachniy @ Nov 29 2014, 09:59) Х...   Nov 29 2014, 18:38
- - ViKo   А сегодня в одном файле - прокатило. А-а-а!...   Nov 28 2014, 08:53


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

 


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


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