programing

c의 여러 파일에 의해 사용되는 헤더의 구조를 선언하려면 어떻게 해야 합니까?

bestcode 2022. 8. 9. 21:43
반응형

c의 여러 파일에 의해 사용되는 헤더의 구조를 선언하려면 어떻게 해야 합니까?

구조를 가진 source.c 파일이 있는 경우:

struct a { 
    int i;
    struct b {
        int j;
    }
};

를 다른 이 파일)에서할 수 요?func.c

파일을 에 포함합니다.func.c

헤더 ?source.c ★★★★★★★★★★★★★★★★★」func.c할 수 extern두두파????

typedef약약면면면면면면면?

이 구조를 다른 파일 func.c에서 사용하는 경우 어떻게 해야 합니까?

파일(예: func.c 파일)에서 유형을 사용할 경우 해당 유형이 표시되어야 합니다.가장 나쁜 방법은 필요한 각 소스 파일에 복사 붙여넣기입니다.

올바른 방법은 이 파일을 헤더 파일에 넣고 필요할 때마다 이 헤더 파일을 포함하는 것입니다.

새로운 헤더 파일을 열고 구조를 선언하고 해당 헤더를 func.c에 포함시킬까요?

이 솔루션이 더 마음에 듭니다.왜냐하면 코드를 매우 모듈화 하기 때문입니다.당신의 구조를 다음과 같이 코드합니다.

#ifndef SOME_HEADER_GUARD_WITH_UNIQUE_NAME
#define SOME_HEADER_GUARD_WITH_UNIQUE_NAME

struct a
{ 
    int i;
    struct b
    {
        int j;
    }
};

#endif

이 구조를 사용하는 함수를 같은 헤더('인터페이스'의 '의미적으로' 일부인 함수)에 넣습니다.

그리고 보통 파일 이름을 구조 이름 뒤에 붙이고 그 이름을 다시 사용하여 헤더 가드 정의를 선택할 수 있습니다.

구조물에 대한 포인터를 사용하여 함수를 선언해야 하는 경우 전체 구조 정의가 필요하지 않습니다.다음과 같은 단순한 순방향 선언:

struct a ;

충분하고 커플링이 감소합니다.

아니면 헤더 파일에 전체 구조를 정의하고 source.c와 func.c 양쪽에 포함할 수 있습니까?

이것은 다른 방법으로 다소 쉬우나 모듈러성은 낮습니다.구조만 작동해야 하는 일부 코드는 모든 유형을 포함해야 합니다.

C++에서는 이것이 흥미로운 문제로 이어질 수 있지만, 이것은 주제에서 벗어났기 때문에(C++ 태그 없음) 자세한 것은 말하지 않습니다.

그럼 어떻게 두 파일에서 그 구조를 외부로 선언할 수 있을까요?

요점은 잘 모르겠습니다만, Greg Hewgill의 투고에서는, 「C의 복수의 파일에 의해서 사용되는 헤더내의 구조를 선언하는 방법」에 매우 좋은 답이 있습니다.

그럼 어떻게 타이핑할까요?

  • C++ 를 사용하고 있는 경우는 사용하지 말아 주세요.
  • C를 사용하고 있다면 사용해야 합니다.

C structure 관리가 문제가 될 수 있는 이유는 다음과 같습니다.struct 키워드를 사용하는 모든 장소에서 선언해야 합니다.

struct MyStruct ; /* Forward declaration */

struct MyStruct
{
   /* etc. */
} ;

void doSomething(struct MyStruct * p) /* parameter */
{
   struct MyStruct a ; /* variable */
   /* etc */
}

typedef를 사용하면 struct 키워드 없이 쓸 수 있습니다.

struct MyStructTag ; /* Forward declaration */

typedef struct MyStructTag
{
   /* etc. */
} MyStruct ;

void doSomething(MyStruct * p) /* parameter */
{
   MyStruct a ; /* variable */
   /* etc */
}

구조물에 대한 이름을 유지하는 것이 중요합니다.기입:

typedef struct
{
   /* etc. */
} MyStruct ;

typedef-ed 이름의 익명 구조체만 생성되므로 포워딩할 수 없습니다.따라서 다음 형식을 사용합니다.

typedef struct MyStructTag
{
   /* etc. */
} MyStruct ;

따라서 struct 키워드를 추가하지 않고 싶은 모든 장소에서 MyStruct를 사용할 수 있으며 typedef가 작동하지 않을 때에도 MyStructTag를 사용할 수 있습니다(즉, 전진 선언).

편집:

Jonathan Leffler에 의해 적절히 언급되었듯이 C99 구조 선언에 대한 잘못된 가정을 수정했습니다.

2018-06-01 편집:

Craig Barnes는 코멘트를 통해 구조적인 "태그" 이름과 "타이프" 이름을 구분하여 사용할 필요가 없음을 상기시켜줍니다. 제가 위에서 설명한 것처럼 말입니다.

실제로 위의 코드는 다음과 같이 작성될 수 있습니다.

typedef struct MyStruct
{
   /* etc. */
} MyStruct ;

IIRC는 C++가 C와의 호환성을 유지하기 위해 뒤에서 간단한 구조 선언을 통해 실제로 수행하는 기능입니다.

// C++ explicit declaration by the user
struct MyStruct
{
   /* etc. */
} ;
// C++ standard then implicitly adds the following line
typedef MyStruct MyStruct;

C로 돌아가면 두 가지 사용법(별도의 이름과 같은 이름)을 모두 확인했지만 단점은 없습니다.따라서 같은 이름을 사용하면 구조체나 다른 기호로 C를 구분하여 "네임스페이스"를 사용하지 않으면 쉽게 읽을 수 있습니다.

둘 이상의 소스 파일에서 사용되는 구조 정의의 경우 반드시 헤더 파일에 넣어야 합니다.그런 다음 구조가 필요한 소스 파일에 해당 헤더 파일을 포함합니다.

extern선언은 구조 정의에 사용되지 않고 변수 선언(즉, 사용자가 정의한 구조 유형의 일부 데이터 값)에 사용됩니다.여러 소스 파일에서 동일한 변수를 사용하는 경우 다음과 같이 선언합니다.extern다음과 같은 헤더 파일에 있습니다.

extern struct a myAValue;

그런 다음 하나의 소스 파일에서 실제 변수를 정의합니다.

struct a myAValue;

이 처리를 잊어버리거나 실수로2개의 소스파일에 정의했을 경우 링커에 의해 이 사실이 통지됩니다.

a.h:

#ifndef A_H
#define A_H

struct a { 
    int i;
    struct b {
        int j;
    }
};

#endif

이제 이 구조를 사용하는 파일에 a.h만 포함하면 됩니다.

언급URL : https://stackoverflow.com/questions/228684/how-to-declare-a-structure-in-a-header-that-is-to-be-used-by-multiple-files-in-c

반응형