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

 
 
> Keil и с99, не работает
sidy
сообщение Oct 29 2012, 14:25
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Здравствуйте, уважаемые форумчане. В проекте, созданном в Keil MDK-ARM 4.54 есть три файла main.c. pwm.h и pwm.c. В файле pwm.h объявленна переменная i. При добавлении в main.c и pwm.c строки #include "pwm.h" возникает ошибка: Proj.axf: Error: L6200E: Symbol i multiply defined (by main.o and pwm.o). В опциях проекта C/C++ в строке Misc Controls задано --С99. Как я понимаю в с99 можно объявлять переменную в нескольких местах, а на этапе компиляции переменная заменится одной. Но почему-то не удается. Подскажите пожалуйста, что я делаю не так?

Сообщение отредактировал sidy - Oct 29 2012, 14:27
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 24)
_Артём_
сообщение Oct 29 2012, 14:35
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(sidy @ Oct 29 2012, 16:25) *
Здравствуйте, уважаемые форумчане. В проекте, созданном в Keil MDK-ARM 4.54 есть три файла main.c. pwm.h и pwm.c. В файле pwm.h объявленна переменная i.

Как объявлена?
Код
int i;

или
Код
extern int i;

?
Второй вариант допустим.
Цитата(sidy @ Oct 29 2012, 16:25) *
При добавлении в main.c и pwm.c строки #include "pwm.h" возникает ошибка: Proj.axf: Error: L6200E: Symbol i multiply defined (by main.o and pwm.o).

Так и должно быть: если "pwm.h" инклудится в оба Си-шных файла, то переменная i получается объявленной в обеих файлах. И получаете ошибку.

Цитата(sidy @ Oct 29 2012, 16:25) *
В опциях проекта C/C++ в строке Misc Controls задано --С99.

С99 здесь нипричом.

Цитата(sidy @ Oct 29 2012, 16:25) *
Как я понимаю в с99 можно объявлять переменную в нескольких местах, а на этапе компиляции переменная заменится одной.

Это как? Приведите пример...

Цитата(sidy @ Oct 29 2012, 16:25) *
Подскажите пожалуйста, что я делаю не так?

Объявляйте переменные в с-файлах:
pwm.c
Код
int SomeVar;


pwm.h
Код
#ifndef _PWM_H_
#define _PWM_H_

extern int SomeVar;

#endif
Go to the top of the page
 
+Quote Post
sidy
сообщение Oct 29 2012, 15:04
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Спасибо за разъяснение. А что означает _PWM_H_?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 29 2012, 15:18
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(sidy @ Oct 29 2012, 17:04) *
Спасибо за разъяснение. А что означает _PWM_H_?


Это называется Include guard.
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Oct 29 2012, 15:34
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



Цитата(sidy @ Oct 29 2012, 19:04) *
Спасибо за разъяснение. А что означает _PWM_H_?

УУ biggrin.gif ) -- это стандартная мегафича препроцессора для того, чтобы не вставлять много раз заголовочный файл.


--------------------
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 30 2012, 08:43
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(_Артём_ @ Oct 29 2012, 17:35) *
Это как? Приведите пример...
Есть такая буква в С (но не в С++!)
Стандарт C99, параграф 6.9.2 External object definitions
Цитата
2 A declaration of an identifier for an object that has file scope without an initializer, and
without a storage-class specifier or with the storage-class specifier static, constitutes a
tentative definition. If a translation unit contains one or more tentative definitions for an
identifier, and the translation unit contains no external definition for that identifier, then
the behavior is exactly as if the translation unit contains a file scope declaration of that
identifier, with the composite type as of the end of the translation unit, with an initializer
equal to 0.

Параграф 6.2.2 Linkages of identifiers
Цитата
1 An identifier declared in different scopes or in the same scope more than once can be
made to refer to the same object or function by a process called linkage.21) There are
three kinds of linkage: external, internal, and none.

2 In the set of translation units and libraries that constitutes an entire program, each
declaration of a particular identifier with external linkage denotes the same object or
function. Within one translation unit, each declaration of an identifier with internal
linkage denotes the same object or function. Each declaration of an identifier with no
linkage denotes a unique entity.


Go to the top of the page
 
+Quote Post
sidy
сообщение Oct 30 2012, 10:15
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Вот вот Параграф 6.2.2 Linkages of identifiers. Все же не понятно, почему подключив --с99 в keil'e мне не удается объявлять переменную с одним и тем же названием в разных файлах.
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 30 2012, 18:31
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(sidy @ Oct 30 2012, 13:15) *
Все же не понятно, почему подключив --с99 в keil'e мне не удается объявлять переменную с одним и тем же названием в разных файлах.
Видимо Keil не соотвествует в этом месте стандарту. Кстати, это место в стандарте появилось задолго до С99, и собственно в С99 оно помеченно как кандидат на удаление в следующих редакциях.

Go to the top of the page
 
+Quote Post
sidy
сообщение Oct 30 2012, 19:03
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



По ссылке http://www.keil.com/support/man/docs/armcc...ef_BABIBBFI.htm сказано что компилятор поддерживает стандарты:
ISO/IEC 9899:1999. The 1999 International Standard for C.
и
ISO/IEC 9899:1999/Cor 2:2004. Technical Corrigendum 2
Как раз в первом стандарте есть параграф 6.2.2
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 31 2012, 08:35
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(sidy @ Oct 30 2012, 22:03) *
По ссылке сказано что компилятор поддерживает стандарты:
ISO/IEC 9899:1999. The 1999 International Standard for C.
и
ISO/IEC 9899:1999/Cor 2:2004. Technical Corrigendum 2
Зафайлите им баг - пусть чинят компилятор rolleyes.gif
Go to the top of the page
 
+Quote Post
yurmala
сообщение Nov 6 2012, 05:51
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 9-02-11
Из: Трехгорный
Пользователь №: 62 814



Кстати, тоже столкнулся с с этой директивой. Давненько уже отписался разрабам Keil. Но как-то они последние месяцы компилятором не шибко заняты.

Сообщение отредактировал yurmala - Nov 6 2012, 05:53
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 6 2012, 11:12
Сообщение #12


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

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



У меня никогда не было подобных сообщений ни c одним компилятором, включая keil.
Приведите минимальный тестовый случай при котором проявляется ваша жалоба. Т.е конкретно содержимое файлов
module1.c
module1.h
module2.c
module2.h
урезанное до минимума.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 6 2012, 11:36
Сообщение #13


Гуру
******

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



QUOTE (demiurg_spb @ Nov 6 2012, 14:12) *
У меня никогда не было подобных сообщений
Просто вы никогда не пользовались этой "фичей" С. Смотрите сообщение №6.
Вот вам урезанный минимум:

module1.c:
CODE
int A;



module2.c:
CODE
int A;


--------------------
На любой вопрос даю любой ответ
"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
ViKo
сообщение Nov 6 2012, 12:22
Сообщение #14


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

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



Прочитав (как сумел) цитаты из стандарта, показанные XVR, я не увидел, что переменные можно несколько раз определять в проекте, без квалификатора extern во всех файлах, кроме того, где переменная инициализируется (или не инициализируется, а просто определяется = резервируется место под нее).
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 6 2012, 12:39
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(ViKo @ Nov 6 2012, 16:22) *
Прочитав (как сумел) цитаты из стандарта, показанные XVR, я не увидел, что переменные можно несколько раз определять в проекте, без квалификатора extern во всех файлах, кроме того, где переменная инициализируется (или не инициализируется, а просто определяется = резервируется место под нее).

Параграф 6.2.2 часть 2. В нем под external linkage понимается глобальная видимость переменных из модуля, а не слово extern в их определении. Т.е. просто int A; будет иметь этот самый external linkage.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 6 2012, 12:45
Сообщение #16


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

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



Цитата(XVR @ Nov 6 2012, 15:39) *
Параграф 6.2.2 часть 2. В нем под external linkage понимается глобальная видимость переменных из модуля, а не слово extern в их определении. Т.е. просто int A; будет иметь этот самый external linkage.

А из чего это следует (понимать так)?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 6 2012, 13:10
Сообщение #17


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

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



Цитата(Сергей Борщ @ Nov 6 2012, 15:36) *
Просто вы никогда не пользовались этой "фичей" С. Смотрите сообщение №6.
Вот вам урезанный минимум:
module1.c:
Код
int A;

module2.c:
Код
int A;
Понятно, я всегда использую static в таких случаях.
Проверил только что на mingw-gcc-4.6.2 - съел молча.


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


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

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



Цитата(demiurg_spb @ Nov 6 2012, 16:10) *
Понятно, я всегда использую static в таких случаях.

Так при static это будут разные переменные.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 6 2012, 13:26
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(demiurg_spb @ Nov 6 2012, 15:10) *
Понятно, я всегда использую static в таких случаях.

Их тогда две будет
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 6 2012, 14:04
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(ViKo @ Nov 6 2012, 16:45) *
А из чего это следует (понимать так)?

Из пункта 1го того же параграфа. Ну и из остального текста, который в цитату не попал rolleyes.gif
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 6 2012, 16:14
Сообщение #21


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Об этом тут уже говорили


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 6 2012, 18:14
Сообщение #22


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

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



Цитата(ReAl @ Nov 6 2012, 19:14) *
Об этом тут уже говорили

ЧуднО! rolleyes.gif
Но ни у K&R, ни у Шилдта об этом ни гу-гу.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 7 2012, 05:06
Сообщение #23


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

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



Цитата(ViKo @ Nov 6 2012, 17:19) *
Так при static это будут разные переменные.
Да я этого обычно и хочу. А когда хочу другого то extern использую.
У меня чёткий стандарт кодирования либо static либо extern, другого для глобальных переменных не дано.
Короче понял я суть "проблемы", всё как всегда - каждый сам себе Буратино...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sidy
сообщение Nov 29 2012, 14:50
Сообщение #24


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Я нашел в Keil'e как можно выбрать gcc компилятор, вместо armcc. GCC 4.6 поддерживает объявление переменных, как было описано выше.
Прикрепленное изображение

Но при попытке скомпилировать проект возникает ошибка: --- Error: failed to execute 'arm-noeabi-as'
Может кто подскажет, что должно быть написано в GNU-Tool-Prefix. По умолчанию стоит arm-noeabi-
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 29 2012, 17:40
Сообщение #25


Гуру
******

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



QUOTE (sidy @ Nov 29 2012, 16:50) *
По умолчанию стоит arm-noeabi-
Зависит от того, какая сборка gcc у вас стоит. В последнее время оно собирается как arm-none-eabi-, раньше модно было делать arm-elf-, бывают еще разные arm-linux-eabi-.


--------------------
На любой вопрос даю любой ответ
"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

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

 


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


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