|
Keil и с99, не работает |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 24)
|
Oct 29 2012, 14:35
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Oct 30 2012, 08:43
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Oct 30 2012, 19:03
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Nov 6 2012, 05:51
|
Участник

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

|
Кстати, тоже столкнулся с с этой директивой. Давненько уже отписался разрабам Keil. Но как-то они последние месяцы компилятором не шибко заняты.
Сообщение отредактировал yurmala - Nov 6 2012, 05:53
|
|
|
|
|
Nov 6 2012, 11:36
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Nov 6 2012, 12:39
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Nov 6 2012, 13:10
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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 - съел молча.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Nov 7 2012, 05:06
|

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

|
Цитата(ViKo @ Nov 6 2012, 17:19)  Так при static это будут разные переменные. Да я этого обычно и хочу. А когда хочу другого то extern использую. У меня чёткий стандарт кодирования либо static либо extern, другого для глобальных переменных не дано. Короче понял я суть "проблемы", всё как всегда - каждый сам себе Буратино...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Nov 29 2012, 14:50
|
Местный
  
Группа: Участник
Сообщений: 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-
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|