Как использовать определенную структуру из другого исходного файла? - PullRequest
7 голосов
/ 15 июня 2010

Я использую Linux в качестве своей платформы программирования и язык C в качестве языка программирования.

Моя проблема в том, что я определяю структуру в своем основном исходном файле (main.c):

struct test_st
{
   int state;
   int status;
};

Итак, я хочу, чтобы эта структура использовалась в моем другом исходном файле (например, othersrc.).Можно ли использовать эту структуру в другом исходном файле, не помещая эту структуру в заголовок?

Ответы [ 7 ]

15 голосов
/ 15 июня 2010

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

// File1.c
struct test_st
{
   int state;
   int status;
};

struct test_st g_test;

// File2.c
struct test_st
{
   int state;
   int status;
};

extern struct test_st g_test;

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

Однако дублирование определения в нескольких исходных файлах является плохой практикой кодирования, поскольку в случае изменений вам придется вручную изменять каждое определение.

Простое решение - поместить определение в заголовочный файл, а затем включить его во все исходные файлы, которые используют структуру. Для доступа к одному и тому же экземпляру структуры в исходных файлах вы все равно можете использовать метод extern.

// Definition.h
struct test_st
{
   int state;
   int status;
};

// File1.c
#include "Definition.h"
struct test_st g_test;

// File2.c
#include "Definition.h"  
extern struct test_st g_test;
13 голосов
/ 15 июня 2010

Вы можете использовать указатели на него в othersrc.c, не включая его:

othersrc.c:

struct foo
{
  struct test_st *p;
};

но в противном случае вам нужно как-то включить определение структуры. Хороший способ - определить его в main.h и включить в оба .c файла.

main.h:

struct test_st
{
   int state;
   int status;
};

main.c:

#include "main.h"

othersrc.c:

#include "main.h"

Конечно, вы можете найти лучшее имя, чем main.h

4 голосов
/ 15 июня 2010

Помещение в заголовочный файл - это нормальный, правильный способ объявления типов, совместно используемых исходными файлами.

За исключением этого, вы можете рассматривать main.c как заголовочный файл и включать его в другой файл, а затем только компилировать другой файл.Или вы можете объявить одну и ту же структуру в обоих файлах и оставить примечание для себя, чтобы изменить его в обоих местах.

3 голосов
/ 15 июня 2010
// use a header file.  It's the right thing to do.  Why not learn correctly?

//in a "defines.h" file:
//----------------------

typedef struct
{
   int state; 
   int status; 
} TEST_ST; 


//in your main.cpp file:
//----------------------

#include "defines.h"

TEST_ST test_st;


    test_st.state = 1;
    test_st.status = 2;




//in your other.ccp file:

#include "defines.h"

extern TEST_ST test_st;

   printf ("Struct == %d, %d\n", test_st.state, test_st.status);
2 голосов
/ 15 июня 2010

C поддержка отдельная компиляция .

Поместить объявление структуры в файл header и #include "..." в исходные файлы.

0 голосов
/ 21 сентября 2018

Вполне разумно включать структуры, оставляя их в исходном файле.Это инкапсуляция.Однако, если вы собираетесь переопределять struct несколько раз в нескольких исходных файлах, вы можете вместо этого определить структуру один раз в заголовочном файле и включить этот файл при необходимости.

0 голосов
/ 14 апреля 2016

Заголовочный файл / * включает этот заголовочный файл как в file1.c, так и в file2.c

strcut a {

};

struct b {

}; 

поэтому в заголовочном файле содержится объявление обеих структур.

file 1.c 

strcut a xyz[10]; -> структурировать определенное здесь

для использования структуры b здесь в этом файле

extern struct b abc[20];

/* now can use in this file */

file2.c

strcut b abc[20]; /* defined here */

чтобы использовать strcut определенный в file1.c

use extern struct a xyz[10]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...