선언하기 전에 구조를 입력합니다.
저는 초보자가 아닙니다. 저는 다음의 관용구에 매우 익숙합니다.
typedef struct Foo_ Foo;// I know typedef struct Foo Foo is fine, I'm just trying to make it clearer
struct Foo_
{
int value;
Foo *link;
};
저는 단지 갑자기 혼란스러움을 느낄 뿐입니다. 왜냐하면 저는 그것이 선언되기 전에 이름(식별자)을 사용하는 것은 허용되지 않는다는 것을 이해하기 때문입니다.하지만 선언문에는typedef struct Foo_ Foo
, 식별기Foo_
아직 존재하지 않습니다!컴파일러가 왜 이런 일을 허용하는 거지?누가 이것에 대해 좀 설명해 주세요. 이런 종류의 구문에 대한 이유가 무엇인지 설명해 주시겠습니까?
위키백과 인용문 : 목적typedef
기존 유형에 대체 이름을 할당하는 것입니다.
--- >8 ---
도움이 되는 많은 정보를 주신 여러분께 감사드립니다.
이건 완전히 괜찮아요.의 첫번째 사용.struct
당신의 것과 같은 태그는 앞으로의 선언입니다.struct
유형.
당신이 사용하는 것은 주의하십시오._Foo
적합하지 않습니다.선두 밑줄과 뒤에 대문자가 있는 식별자는 예약됩니다.그러지마세요.뒤에 밑줄을 긋는 것도 괜찮습니다.
이 내용은 6.7.2.3p8에서 다룹니다.
6.7.2.3 Tag
의미론
[...]8 - [구조 또는 조합 정의] 또는 [구조 또는 조합 선언]이 아닌 형태의 구조 또는 조합 식별자의 유형 지정자가 발생하고, 태그로서 식별자의 다른 선언이 보이지 않으면, 불완전한 구조 또는 조합 유형을 선언하고, 식별자를 해당 유형의 태그로서 선언합니다.
유형 지정자struct Foo
인에typedef struct Foo Foo
정의에 없습니다(struct Foo {...};
) 또는 선언(struct Foo;
6.7.2.3p8에 해당합니다.
주의할 점은 특별한 것이 없다는 것입니다.typedef
; 당신은 또한 글을 쓸 수 있습니다.
struct A { struct Foo *p; };
그리고 이전의 정의나 선언이 보일 필요는 없습니다.
그러나 함수 선언 또는 정의에서:
void foo(struct Foo *p);
한다면struct Foo
이전에 선언되지 않은 경우 선언의 범위는 함수 선언 또는 정의일 뿐이며, 이후의 선언 또는 정의와 유형 compat 가능하지 않습니다.Foo
.
ISO c99 : 6.2.1 Scopes of identifiers
7
구조, 조합 및 열거 태그에는 태그를 선언하는 형식 지정자에서 태그가 나타나는 직후 시작되는 범위가 있습니다.
typedef struct _Foo Foo; // You can do this because it's just the typedef the new type
struct _Foo *myfoo ; // It's pointer to struct _Foo (an incomplete type)
//but make sure before using myfoo->value
// struct definition should be available
struct _Foo MyFoo; // It's definition of MyFoo but don't forget
// to give the definition of struct _Foo (gcc extension).
struct _Foo; // forward declaration
struct _Foo // It's the definition
{
int value;
Foo *link;
};
단순하게는functions
우리가 합니다forward declaration
아니면typedef
함수의 실제 정의 전에, 그래서 우리는 그것을 할 수 있습니다.struct
또한.
void func(int );
typedef void (*func_t)(int);
void func(int x)
{
//actual definition
}
typedef
형식의 별칭을 만드는 데 사용됩니다.하지만 그런 타입은 디프를 할 때 꼭 존재하는 것은 아닙니다.
예를들면,
만약 당신이 그렇게 한다면:
struct Foo;
그리고 당신은 결코 정의하지 않습니다.struct Foo
프로그램의 어느 곳이든 컴파일이 가능합니다.컴파일러는 그것이 어딘가에 정의되어 있다고 가정하고 계속합니다.구조를 정의하지 않고 사용하는 경우에만 오류가 발생합니다.
이와 비슷한 경우입니다.typedef
뿐만 아니라.
특정한 상황에서, a를 사용하는 것은 유효합니다.struct ...
선언하기 전에 입력합니다.그렇다면 이른바 '불완전한 유형'입니다.
예를 들어, 변수를 "불완전한" 구조의 포인터로 선언하는 것과 (보시는 것처럼) a로 선언하는 것이 유효합니다.typedef
.
포워딩 포워딩 포워딩 포워딩 포워딩 포워딩.전달 선언을 사용하면 불완전한 형식이 허용되는 컨텍스트에서 이름을 사용할 수 있습니다.
컴파일러가 typedef 태그를 "보기"하고, type이 발견될 때까지 저장하므로 typedef 뒤에 type이 선언되어 있는 한, 그러나 사용하기 전에는 괜찮습니다.
typedef 선언을 사용하면 int, float 및 double과 같은 type 지정자 대신 사용할 수 있는 고유한 식별자를 정의할 수 있습니다.typedef 선언이 저장소를 예약하지 않습니다.
자세한 정보는 http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=%2Fcom.ibm.vacpp6m.doc%2Flanguage%2Fref%2Fclrc03typdef.htm 에서 확인하실 수 있습니다.
언급URL : https://stackoverflow.com/questions/13626246/typedef-a-struct-before-its-declared
'programing' 카테고리의 다른 글
jQuery를 사용하여 하나의 태그를 다른 태그로 바꾸기 (0) | 2023.11.05 |
---|---|
Oracle 11g의 select 절에 있는 이중/랜덤 별칭 이름이 잘못된 식별자 예외를 던지지 않습니다. (0) | 2023.11.05 |
WHERE 문이 작동하지 않음 (0) | 2023.10.31 |
"host.docker.internal"과 동등한 리눅스란 무엇입니까? (0) | 2023.10.31 |
자바스크립트에서 이중부정(!!!) - 목적은? (0) | 2023.10.31 |