2012-07-05 6 views
3

"unnamed-struct"유형의 전역 객체가 있는데이를 정의하려고합니다. 그런 쓸모없는 타입으로 글로벌 네임 스페이스를 오염시키고 싶지는 않습니다 (한 번 사용됩니다).Extern unnamed struct 객체 정의

Global.h

extern struct { 

    int x; 

} A; 

같은 객체를 정의 할 수있는 올바른 방법이 있나요?

Global.cpp

struct { 

    int x; 

} A = { 0 }; 

을하지만 VS2012 예외 :
나는이 시도되었다 "오류 C2371 : 'A': 재정의; 다른 기본 유형". 감사.

+1

한 번만 사용하면 왜 .h 파일에 넣을 수 있습니까? –

+0

전 프로젝트에서 사용하고 있습니다. – HemoGoblin

+0

@HansPassant : 그는 단지 클래스의 _instance_ 하나만 가지고 있습니다. –

답변

2

하나의 가능한 솔루션 : Global.h가없고 다른 파일 인 Global_A.cpp를 만들고 거기에 A을 정의하십시오. 동등 정의 규칙에 의해 익명 구조체 정의가 동등한 한 유효합니다.

이것은 여전히 ​​좋은 생각이 아니며 대부분의 컴파일러는 경고합니다. (gcc) : 경고 : 비 로컬 변수 '< anonymous struct> A'는 익명 형식 인을 사용합니다.

1

오류가 발생할 가능성이 높기 때문에이 작업을 수행 할 방법이 없습니다. 누군가 (아마도 사용자 일지라도)이 구조의 정의를 수정하려고 할 수 있으며 헤더 및 소스에서이 작업을 수행하는 것을 잊어 버릴 수 있습니다. 그에 따라 파일. 따라서이 구조체의 이름을 고안하고 소스 파일의 이름을 사용하고 정의를 헤더까지 남겨 두어야합니다.

0

이것이 내가 당신을 돕는 지 모르겠지만이 첫 번째 게시물 ... 그래서 쉽게 받아들입니다.

방금이 문제가 발생했으며 익명 구조체가 들어있는 파일에 구조체를 조작하는 함수가 추가되었습니다. 그렇게하면 내 프로젝트의 모든 파일에서 해당 함수를 호출 할 수 있으며 구조체의 값을 조작합니다. 나는 다른의 명령 줄 인터페이스를 제작하고 있기 때문에

struct 
    {  
     char line1[80]; 
     char line2[80]; 
     char line3[80]; 
    } header; 

내가 "interface.c"에 그 값을 조작 할 :

header.c이 익명 구조체를 가지고 : 여기

은 예입니다 파일. 내 첫 번째 본능은 extern을 사용하는 것이었지만 header.c에 다음 함수를 추가하는 것만 큼 좋거나 낫습니다 (피할 수있는 경우 외부 사람들의 사용을 방해하는 사람들이 있습니다).

void changeHeaders(char *one, char *two, char *three); 
void changeHeaders(char *one, char *two, char *three) 
{ 

    strcpy(header.line1, one); 
    printf("\nHeader 1: %s", header.line1); 
    strcpy(header.line2, two); 
    printf("\nHeader 2: %s", header.line2); 
    strcpy(header.line3, three); 
    printf("\nHeader 3: %s", header.line3); 

} 

이제는 해당 함수의 프로토 타입을 포함하는 한 해당 함수를 사용하여 모든 파일에서 해당 구조체 변수를 조작 할 수 있습니다. 희망은 누군가를 돕습니다.