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

 
 
 
Reply to this topicStart new topic
> Битовые поля и анонимная структура,IAR PIC v2.21C, Линкер ругается на повторное обьявление
SergeyTT
сообщение Jan 9 2010, 22:00
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 3-07-06
Из: Харьков
Пользователь №: 18 533



Доброго времени суток!
Помогите,плиз,победить такую ситуацию - объявил битовые поля в анонимных структуре и объединении:
Код
//defs.h
#ifndef _DEFS_H
#define _DEFS_H
union{
    unsigned char letters;
    struct{
        unsigned char alpha        :1;
        unsigned char bravo        :1;
        unsigned char :1;
        unsigned char :1;
        unsigned char :1;
        unsigned char :1;
        unsigned char :1;
        unsigned char :1;
    };
};
#endif

Включил этот хидер в модули main.c
Код
//main.c
#include <io16f628.h>
#include "defs.h"

extern void one(void);

void main(void)
{
    alpha = 1;
    one();
}

и one.c
Код
//one.c
#include <io16f628.h>
#include "defs.h"

void one(void)
{
    bravo = 1;
    if(alpha)
        bravo = 0;    
    return;

}

Линкеру это дело не понравилось и он выдал:
Код
Linking...
XLINK: E:\Project\TEST\Debug\Obj\handler.r39 E:\Project\TEST\Debug\Obj\main.r39 E:\Project\TEST\Debug\Obj\one.r39 -o E:\Project\TEST\Debug\Exe\test.d39 -rt -l E:\Project\TEST\Debug\List\test.map -xes -IE:\XTools\IAR\PIC221C\PICmicro\LIB\ -f E:\Project\TEST\test.xcl
Error[e27]: Entry "_A_letters" in module main ( E:\Project\TEST\Debug\Obj\main.r39 ) redefined in module one ( E:\Project\TEST\Debug\Obj\one.r39 )

Total number of errors: 1
Total number of warnings: 0

Смотрю в словарик ругательств XLINK
Код
27    Entry entry in module module (file) redefined in module module (file)
There are two or more entries with the same name. Linker aborts immediately.

© IAR Systems 1998


Вот я и недоумеваю - вроде ведь все сделано по-науке,на аналогичные объявления полей и структур в io16f628.h линкер не гавкает, как его угомонить?
Причина редактирования: Оформление кода + излишнее цитирование.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Jan 9 2010, 22:35
Сообщение #2


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(SergeyTT @ Jan 10 2010, 01:00) *
..вроде ведь все сделано по-науке
Ежели "по-науке", то в .c завести объект, а в .h объявить extern на него, и делать include этого .h.
Здесь же можно попробовать объявить union как static.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 9 2010, 22:43
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(SergeyTT @ Jan 10 2010, 01:00) *
Вот я и недоумеваю - вроде ведь все сделано по-науке,на аналогичные объявления полей и структур в io16f628.h линкер не гавкает, как его угомонить?

По какой науке??? Создали (именно создали) по два экземпляра переменных с одними именем. Абсолютная и безвариантная ошибка и нечего на компиляторы с линкерами, битовые поля и union пенять.
Moderator:
Тему перенес.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 10 2010, 00:11
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



В хедере нужно создать новый именованный тип на основе данного union. Объявить переменную с этим типом в одном из Си-шных файлов. В другом Си-шнике объявить как extern.
Go to the top of the page
 
+Quote Post
SergeyTT
сообщение Jan 10 2010, 00:52
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 3-07-06
Из: Харьков
Пользователь №: 18 533



Цитата(rezident @ Jan 10 2010, 02:11) *
В хедере нужно создать новый именованный тип на основе данного union. Объявить переменную с этим типом в одном из Си-шных файлов. В другом Си-шнике объявить как extern.

На extern линкер тоже ругался...
Я поступил так: создал анонимный юнион и структуру с битовыми полями в первом сишнике(letters в main.c),объявил имена этих полей в хидере main.h. Затем создал другой "учебный" анонимный юнион и структуру с битовыми полями в другом сишнике(digits в one.c) и объявил имена этих полей в хидере one.h Потом подключил к main.c хидер one.h, а к сишнику one.c - хидер main.h и проблема ушла.
Спасибо всем за помощь!
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 10 2010, 01:33
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(SergeyTT @ Jan 10 2010, 05:52) *
Потом подключил к main.c хидер one.h, а к сишнику one.c - хидер main.h и проблема ушла.
Ну и зачем такое извращение? Теперь при изменении одного придется править и другой тоже. Ладно их два, а когда их нужно в пару-тройку десятков исходников включить, что делать будете? Создание нового типа с помощью typedef это совершенно легальный стандартный путь для таких случаев. Причем создается один хедер, который потом можно включать в неограниченное количество исходников.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 05:55
Рейтинг@Mail.ru


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