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

 
 
 
Reply to this topicStart new topic
> Странности KEIL
artur_off
сообщение Jan 9 2010, 09:47
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 24-05-08
Из: Odessa
Пользователь №: 37 784



Я понимаю, что вопрос возможно дилетантский, но выхода нет.

Есть свой h файл с глобальной переменной и дефайнами:

Код
#ifndef _STATE_OF_ENGINE_H_
#define _STATE_OF_ENGINE_H_

#define START_ENGINE    1
#define STOP_ENGINE        2
#define ROTATION_C        3
#define ROTATION_CC        4

vu8 state_of_engine = STOP_ENGINE;

#endif


этот файл подключается в двух файлах, переменная state_of_engine в этих файлах объявлена как extern. При линковке выдается следующая ошибка:

.\output\MC.axf: Error: L6200E: Symbol state_of_engine multiply defined (by main.o and 91x_it.o).

я нашел один выход, но он не оптимальный. его суть заключается вот в чем. все дефайны из этого файла переносятся в другой h файл, этот файл подключается везде где необходимы эти дефайны, а файл с переменной state_of_engine подключается только один раз в любом из сишных файлов, например в main.c.

В таком случае ошибок при линковке нет, но этот способ не оптимальный, так как требует создавать несколько h файлов.

Ради интереса, скомпилировал простой промер в борладне, в нем такой проблемы не было.

Сообщение отредактировал artur_off - Jan 9 2010, 09:51


--------------------
 Big time. 
Go to the top of the page
 
+Quote Post
VAI
сообщение Jan 9 2010, 10:01
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Я делаю 1 h-файл, вот такой:
Код
/* --- global.h ------------------------------------------------------------------------------------------- **
*
* -------------------------------------------------------------------------------------------------------- */
#ifndef _MY_global_H
  #define _MY_global_H

#if defined( MAIN_FILE )                // объявлена в файле, где функция main()
  #define gl_data
#else   // MAIN_FILE
  #define gl_data extern
#endif  // MAIN_FILE


// --- Глобальные данные ---------------------------------------------------------------------------------- **
gl_data volatile FLAG flag;
gl_data volatile short cur_work_mode;
gl_data unsigned int progress_index;


// --- end of file ---------------------------------------------------------------------------------------- **

А в одном из файлов, до
Код
#include "global.h"

объявляю
Код
#define MAIN_FILE

И это не странности кейла, а так положено. Если вы обзываете переменную extern, то подразумевается, что она внешняя, и где-то должно быть выделено для неё место. Вот в одном из с-файлов проекта это надо сделать. Вы это делали, добавляя ещё 1 h-файл, а я так:
Код
#if defined( MAIN_FILE )                // объявлена в файле, где функция main()
  #define gl_data
#else   // MAIN_FILE
  #define gl_data extern
#endif  // MAIN_FILE


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 9 2010, 10:03
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(artur_off @ Jan 9 2010, 16:47) *
Я понимаю, что вопрос возможно дилетантский...
...Ради интереса, скомпилировал простой промер в борладне, в нем такой проблемы не было...
Ага, борланд как раз для дилетантовsmile.gif
Один из вариантов: Объявите глобальную переменную в любом С файле, а в хедере этого файла продекларируйте extern "value_type" value. После этого все C файлы, использующие хедер с объявленной внешней переменной будут ее видеть.


--------------------
Go to the top of the page
 
+Quote Post
artur_off
сообщение Jan 9 2010, 10:09
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 24-05-08
Из: Odessa
Пользователь №: 37 784



Спасибо, оба способа работают.

Сообщение отредактировал artur_off - Jan 9 2010, 10:18


--------------------
 Big time. 
Go to the top of the page
 
+Quote Post

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

 


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


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