2010-06-15 4 views
4

저는 프로그래밍 플랫폼으로 Linux를 사용하고 프로그래밍 언어로 C 언어를 사용하고 있습니다.다른 소스 파일에서 정의 된 구조체를 사용하는 방법은 무엇입니까?

내 문제는 내 주요 소스 파일 (을 main.c를) 구조를 정의 할 수 있습니다 : (. 예컨대 othersrc.)

struct test_st 
{ 
    int state; 
    int status; 
}; 

그래서 나는이 구조 내 다른 소스 파일에 사용하려고합니다. 이 구조체를 헤더에 넣지 않고도이 구조체를 다른 소스 파일에서 사용할 수 있습니까?

othersrc.c :

+1

확실한 것은, 시도하기 전에 정의 된만큼 시도하고 사용하려고하는 파일을 포함하십시오. –

+3

헤더를 포함하고 싶지 않은 이유를 이해하지 못합니다. –

답변

12

당신은 그것을 포함하지 않고 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" 

은 물론, 당신은 아마 주보다 더 좋은 이름을 찾을 수 있습니다. h

+0

othersrc.c와 비슷합니다. struct test_st * lcst를 정의해야합니다. ? – domlao

+0

전달 선언이 불필요하며 포인터를 선언하기 만하면됩니다. 그래서'void foo (test_st * lcst);' 함수를 작성할 수 있지만 구조체 안에있는 모든 필드를 볼 수 있으므로 그 내부 데이터로 작업해야하는 모든 것이 main.c에 있어야합니다 또는 구조체 정의를 헤더에 넣을 수 있습니다. – Spudd86

4

ader 파일은 소스 파일간에 공유되는 유형을 선언하는 정상적이고 올바른 방법입니다.

예외가 없다면 main.c를 헤더 파일로 처리하고 다른 파일에 포함시킨 다음 다른 파일 만 컴파일 할 수 있습니다. 또는 두 파일에서 같은 구조체를 선언하고 두 위치에서 변경하려면 자신에게 메모를 남길 수 있습니다.

2

c 지원 separate compilation.

구조체 선언을 헤더 파일과 #include "..." 소스 파일에 넣습니다.

당신은 각 소스 파일에 구조체를 정의 할 수 있습니다
11

후 세계로 한 번 인스턴스 변수를 선언하고 한 번 통근과 같이

// 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; 
+0

왜 잘못 되었습니까? – shinzou

+0

@kuhaku : 헤더 파일에 구조를 정의해야합니다. 정의를 복제하는 것은 변경의 경우 각 정의를 수동으로 변경해야하므로 매우 나쁜 프로그래밍 습관입니다. – Wizard79

+1

완벽한 답변 ..... :) – Chirag

2
// 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); 
+1

정말 typedef가 필요하지 않으며 어떤 사람들은 그들을 좋아하지 않습니다. – Spudd86

0

내가 믿는 별명 TEST_ST가 대해서 typeof없이 글로벌되고, 따라서 당신은 그 구조에 대한 액세스를 제공합니다.미안해.

0

헤더 파일/*는

strcut a { 

}; 

struct b { 

}; 

그래서 헤더 파일 구조 모두의 선언을 포함이 헤더 모두 file1.c에서의 파일 인 file2.c를 포함한다.

file 1.c 

strcut a xyz[10]; -> A가

extern struct b abc[20]; 

/* now can use in this file */ 

와 file2.c

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

가 정의 strcut 사용이 파일 여기 구조체 (B)를 사용하여 여기

정의 구조체 file1.c

use extern struct a xyz[10] 
관련 문제