Как поделиться структурами в нескольких файлах в моей программе? - PullRequest
2 голосов
/ 17 августа 2011

Вот моя проблема: У меня есть большой файл main.c, содержащий около 40 «глобальных» структур в моей программе (они объявлены в начале файлов), у меня также есть несколько функций в файле main.c, которые я могу непосредственно читать и написать в эти структуры, так как они являются глобальными. Теперь я пытаюсь переместить несколько функций из моего исходного файла main.c в другой файл .c, который будет содержать только функции, относящиеся к определенной части моей программы. Но, конечно, я не могу напрямую получить доступ к глобальным переменным main.c из моего нового файла .c. Это можно обойти? Я хотел бы избежать передачи каждой структуры по указателю, так как это получило бы ужасные прототипы функций. спасибо

Ответы [ 6 ]

7 голосов
/ 17 августа 2011

Переместите определения глобальной структуры в файл заголовка (.h) и просто #include ваш заголовок в каждом файле c, которому требуется доступ к этим структурам.Любые глобальные переменные могут быть объявлены extern и затем определены в вашем файле main.c.

Global.h

// WARNING: SHARING DATA GLOBALLY IS BAD PRACTICE

#ifndef GLOBAL_H
#define GLOBAL_H

//Any type definitions needed
typedef struct a_struct
{
    int var1;
    long var2;
} a_struct;

//Global data that will be defined in main.c
extern a_struct GlobalStruct;
extern int GlobalCounter;

#endif

main.c

#include "Global.h"
#include "other.h"

#include <stdio.h>

int GlobalCounter;
a_struct GlobalStruct;

int main(int argc, char *argv[])
{
    GlobalCounter = 5;

    GlobalStruct.var1 = 10;
    GlobalStruct.var2 = 6;

    printf("Counter: %d\nStruct [ var1: %d var2: %ld ]\n", 
           GlobalCounter, GlobalStruct.var1, GlobalStruct.var2);

    do_other_stuff();

    printf("Counter: %d\nStruct [ var1: %d var2: %ld ]\n", 
           GlobalCounter, GlobalStruct.var1, GlobalStruct.var2);

    return 0;   
}

other.h

#ifndef OTHER_H
#define OTHER_H

void do_other_stuff(void);

#endif

other.c

#include "other.h"
#include "Global.h"

void do_other_stuff(void)
{
    GlobalCounter++;
    GlobalStruct.var1 = 100;
    GlobalStruct.var2 = 0xFFFFFF;
}
2 голосов
/ 17 августа 2011
  1. Создайте файл заголовка с объявлениями для ваших структур
  2. включите этот файл заголовка, где это необходимо.

РЕДАКТИРОВАТЬ Извините за этот недружественный ответ.

Как вы упомянули в своем комментарии, вы обычно объявляете прототипы своих функций в заголовочных файлах.Вы можете использовать заголовочные файлы также для объявления:

  • переменных
  • структур

Поскольку структуры в этом случае похожи на классы в C ++, вам необходимообъявить полное тело структуры, чтобы получить доступ к структурам-членам.Если вы используете функции в структуре, вы должны реализовать их в отдельном C-файле.

1 голос
/ 17 августа 2011

Вы можете получить к ним доступ, используя extern.

В main.c:

MY_STRUCT my_global_struct;

В otherfile.c:

extern MY_STRUCT my_global_struct;

0 голосов
/ 17 августа 2011

Если вы хорошо представляете структуры, используйте подход заголовка из нескольких других ответов.Если нет, то передайте пустые указатели в глобальном интерфейсе и приведите к типу структуры в соответствующих исходных файлах.

0 голосов
/ 17 августа 2011

Так же Джо на правильный ответ.Но я бы добавил, что вам следует избегать использования глобальных данных.Это делает поток данных между функциями и модулями сложным и загадочным.В большинстве случаев лучше передавать данные, которые вам нужны явно.

0 голосов
/ 17 августа 2011

Я думаю, что глобальных переменных обычно следует избегать, но чтобы ответить на ваш вопрос, вы должны объявить все свои структуры в файле .h с ключевым словом extern:

// my_structs.h
struct A
{
   char c;
};

extern struct A myA; // declare the struct with extern, meaning it will be linked from a different compilation unit

// main.c

#include "my_structs.h"
struct A myA; // actually define struct, all others will be linked to this by the linker
//...

// other.c

#include "my_structs.h"

void accessMyA()
{
    printf ("%c", myA.c);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...