Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Битовые поля и анонимная структура,IAR PIC v2.21C
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
SergeyTT
Доброго времени суток!
Помогите,плиз,победить такую ситуацию - объявил битовые поля в анонимных структуре и объединении:
Код
//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 линкер не гавкает, как его угомонить?
SysRq
Цитата(SergeyTT @ Jan 10 2010, 01:00) *
..вроде ведь все сделано по-науке
Ежели "по-науке", то в .c завести объект, а в .h объявить extern на него, и делать include этого .h.
Здесь же можно попробовать объявить union как static.
zltigo
Цитата(SergeyTT @ Jan 10 2010, 01:00) *
Вот я и недоумеваю - вроде ведь все сделано по-науке,на аналогичные объявления полей и структур в io16f628.h линкер не гавкает, как его угомонить?

По какой науке??? Создали (именно создали) по два экземпляра переменных с одними именем. Абсолютная и безвариантная ошибка и нечего на компиляторы с линкерами, битовые поля и union пенять.
Moderator:
Тему перенес.
rezident
В хедере нужно создать новый именованный тип на основе данного union. Объявить переменную с этим типом в одном из Си-шных файлов. В другом Си-шнике объявить как extern.
SergeyTT
Цитата(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 и проблема ушла.
Спасибо всем за помощь!
rezident
Цитата(SergeyTT @ Jan 10 2010, 05:52) *
Потом подключил к main.c хидер one.h, а к сишнику one.c - хидер main.h и проблема ушла.
Ну и зачем такое извращение? Теперь при изменении одного придется править и другой тоже. Ладно их два, а когда их нужно в пару-тройку десятков исходников включить, что делать будете? Создание нового типа с помощью typedef это совершенно легальный стандартный путь для таких случаев. Причем создается один хедер, который потом можно включать в неограниченное количество исходников.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.