Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нужно битовое поле сделать видимыи глобально
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
smk
Понимаю, что ламерский вопрос, но всеже. Есть структура (пример из учебника):
Код
struct {
    unsigned int is_keyword : 1;
    unsigned int is_extern  : 1;
    unsigned int is_static  : 1;
} flags;


У меня проект (например) состоит из файлов main.h; main.c; timer.h; timer.c . Нужно так объявить битовое поле flags чтобы оно было видимо во всех подключаемых файлах т.к. флаги будут использоваться обширно. Keil. Спасибо.
Snaky
создайте свой тип данных (например в main.h)
Код
typedef struct {
         unsigned int is_keyword : 1;
         unsigned int is_extern  : 1;
         unsigned int is_static  : 1;
     } Flags_t;


а потом объявите глобальную переменную этого типа (например в main.c). должно работать
ну и в timer.h не забыть указать что она extern
Marto
Хм.
Вроде как обычно делают global_variable.c и global_variable.h.
в global_variable.c объявляем переменную(struct flags flag_a;), а в global_variable.h объявляем ее уже со спецификатором extern (extern struct flags flag_a ).
А потом инклудим global_variable.h в нужные файлы.
Sirko
Цитата
обычно делают global_variable.c и global_variable.h


Я обхожусь только h-файлом.
В main пишу:
#define MAIN_CPP

а global.h выглядит примерно так:

Код
typedef struct{
    int x;
    bool y;
}MyStruct;


#ifdef MAIN_CPP
   volatile MyStruct my = {0, false};
   volatile int arr[16] = {0};
#else
   extern volatile MyStruct my;
   extern volatile int arr[16];
#endif//MAIN
ReAl
Цитата(Sirko @ Aug 26 2012, 19:58) *
Я обхожусь только h-файлом.
В main пишу:
#define MAIN_CPP
Вот что-то мне такое не понравилось, не знаю почему. Несколько подходов делал, пробовал даже так (GCC, не знаю, держит ли еще кто-то variadic macro):

Код
#ifdef GLOBALS_HERE
#define GLOBALVAR(var,...) var = __VA_ARGS__
#else
#define GLOBALVAR(var,...) extern var
#endif

typedef struct {
        int a,b;
} foo_t;

GLOBALVAR(foo_t f, {1,2});
GLOBALVAR(char s[],"abcdef");
Но всё равно раздельно руками пишу.

Вдогонку -- пожалуй, если делать, то стоит знак равно из макроса выкинуть, писать его при применении. Тогда можно будет и неинициализированные переменные через тот же макрос:
Код
#ifdef GLOBALS_HERE
#define GLOBALVAR(var,...) var __VA_ARGS__
#else
#define GLOBALVAR(var,...) extern var
#endif

typedef struct {
        int a,b;
} foo_t;


GLOBALVAR(foo_t f1, = {1,2});
GLOBALVAR(char s[], = "abcdef");

GLOBALVAR(foo_t f2);
_Артём_
Цитата(smk @ Aug 26 2012, 12:02) *
Нужно так объявить битовое поле flags чтобы оно было видимо во всех подключаемых файлах т.к. флаги будут использоваться обширно. Keil. Спасибо.


file1.h:
Код
#ifndef FILE1_h__
#define FILE1_h__


struct TFlags {
    unsigned int BitField0: 1;
    unsigned int BitField1: 2;
    //.....
};

extern struct TFlags Flags;

#endif


file1.c:

Код
#include "file1.h"
struct TFlags Flags;


Такой способ не годится?
Или это что-то не то?
andrewlekar
Цитата
Такой способ не годится?
Или это что-то не то?

Это абсолютно правильный способ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.