2010-12-20 3 views
2

20 년 된 DOS 시스템에서 GNU Linux 시스템으로 이전 코드를 이전하려고합니다. 헤더 파일 중 몇 곳 (장소 전체에 포함되어 있음)에는 선언하고 초기화하는 구조체 구조체가 있습니다. 레거시 코드가 작성된 방식으로 컴파일 할 때 경고가 표시됩니다. 동일한 헤더 파일 안에 머물러야 어떻게 작동하는지 알 수 있습니다.C에서 헤더 파일 내부에 구조체의 구조체를 초기화하는 방법은 무엇입니까?

다음은 내가하는 일을 단순화 한 예입니다.

struct A 
{ 

    struct B temp1; 
    struct C temp2; 
}; 

struct B 
{ 

    int temp3; 
    int temp4; 
    int temp5; 
}; 

struct C 
{ 

    int temp6; 
    int temp7; 
    int temp8; 
}; 


//These are the variables in how they are related to the initialization below 

//struct A test_one = {{temp3,temp4,temp5},{temp6,temp7,temp8}}; 

struct A test_one = {{1,2,3},{4,5,6}}; 
+2

경고는 무엇입니까? – OrangeDog

답변

1

선언 구조체 B 그리고 전 C, 즉 :

struct B { int temp3; int temp4; int temp5; }; 
struct C { int temp6; int temp7; int temp8; }; 
struct A { struct B temp1; struct C temp2; }; 
+0

나쁘다, 나는 단지 간단한 예를 구성하고 있었다. 실제 코드에서 "구조체 A"는 B와 C 뒤에 선언됩니다. – user548800

6

당신은 헤더 파일에 어떤 구조를 인스턴스화하지 않아야합니다. 각각의 C 파일에 다른 인스턴스가 만들어지면 일반적으로 원하는 효과가 아닌 헤더를 포함하게됩니다.

이렇게하려면 C 파일에서 다음을 수행해야합니다.

void foo(){ 
struct A parent; 
struct B child_b; 
struct C child_c; 

child_b.temp3 = 3; 
child_b.temp4 = 4; 
child_b.temp5 = 5; 

child_c.temp6 = 6; 
child_c.temp7 = 7; 
child_c.temp8 = 8; 

parent.temp1 = child_b; 
parent.temp2 = child_c; 
} 

당신이 배열 초기화 구문은 다음 조합을 사용하는 것이 유지하고 싶은 경우에 나는 강한이

void initB(struct B* s, int x, int y, int z){ 
    s->temp3 = x; 
    s->temp4 = y; 
    s->temp5 = z; 
} 

유사 도우미 기능을 고려할 것입니다.

+0

특히 정적으로 선언되지 않았기 때문입니다. 나는 몇 년 전에 비슷한 것을 한 사람을 알고있다. 불평하는 대신에, 다중으로 정의 된 변수에 대한 각각의 참조에 대해 링커는 인스턴스 중 하나를 무작위로 사용하는 것처럼 보였다. – JeremyP

+0

@JeremyP : 헤더 파일에서 변수 extern을 선언하고 하나의 컴파일 단위로 초기화하고 초기화해야합니다. –

+0

실제로 헤더 대신 C 파일 내부에서 똑같은 일을 시도했지만 동일한 경고가 나타납니다. 나는 "구조체 C의 구조체를 초기화하는 방법"에 대해 원래 질문을 다시 말해야한다고 생각합니다. 내가 얻는 경고는 "초기화 초기에 경고가 나타남"과 함께 경고가 "누락 된 경고 표시 줄"입니다. – user548800

0

불완전한 유형을 사용하여 struct 명의 회원을 선언하는 것은 불법이므로 게시 한 코드는 편집 할 수 없습니다. 나는 당신이 단순히 struct 정의를 잘못 정렬했다고 가정합니다 : BC에 대한 정의가 우선되어야합니다.

헤더 파일이 여러 번역 단위에 포함되어있는 경우이 코드가 생성 할 수있는 유일한 경고는 동일한 개체 test_one의 여러 정의에 대해 불평 할 수있는 링커의 경고입니다. C에서는 많은 컴파일러가이를 널리 사용되는 컴파일러 확장으로 허용하지만 기술적으로는 불법입니다.

그래서 "경고"는 무엇입니까?

+0

"near initializtion for ...."경고와 함께 "initializer 주위에 bracket이 없습니다"라는 경고가 나타납니다. – user548800

관련 문제