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

 
 
 
Reply to this topicStart new topic
> Нужно битовое поле сделать видимыи глобально, подскажите как правильно
smk
сообщение Aug 26 2012, 09:02
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Понимаю, что ламерский вопрос, но всеже. Есть структура (пример из учебника):
Код
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. Спасибо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Snaky
сообщение Aug 26 2012, 09:15
Сообщение #2


Mute Beholder
***

Группа: Свой
Сообщений: 260
Регистрация: 4-04-07
Из: Третья планета от Солнца
Пользователь №: 26 754



создайте свой тип данных (например в 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


--------------------
Common sense is not so common.
Go to the top of the page
 
+Quote Post
Marto
сообщение Aug 26 2012, 11:39
Сообщение #3


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

Группа: Свой
Сообщений: 103
Регистрация: 17-05-09
Из: Ижевск
Пользователь №: 49 190



Хм.
Вроде как обычно делают 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 в нужные файлы.


--------------------
Шизоидный холерик
Go to the top of the page
 
+Quote Post
Sirko
сообщение Aug 26 2012, 16:58
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Цитата
обычно делают 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
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 26 2012, 18:36
Сообщение #5


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(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);


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 26 2012, 18:38
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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;


Такой способ не годится?
Или это что-то не то?
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Aug 27 2012, 04:39
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



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

Это абсолютно правильный способ.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 18:42
Рейтинг@Mail.ru


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