같은 scope | 다른 scope | |
---|---|---|
같은 tag | 호환 O | 호환 X |
다른 tag | 호환 X | 호환 X |
typedef struct foo foo; /* struct foo is incomplete type.*/
struct foo
{
/*member declaration*/
};
struct foo
{
/*member declaration*/
};
struct foo object1;
{
struct foo
{
/*member declaration*/
};
struct foo object2;
object2 = object1; /* wrong */
}
compiler: GNU GCC Compiler
error: incompatible types when assigning to type 'struct foo' from type 'struct foo'
struct foo
{
/*member declaration*/
};
struct bar
{
/*member declaration*/
};
struct foo
{
/*member declaration*/
};
{
struct bar
{
/*member declaration*/
};
}
그러나, 예외적인 규칙이 존재한다.
멤버 선언이 없이, 바로 declarator(선언자)가 따르는 형태의 구조체 선언에 적용되는 규칙이다.
🖇️cf) declarator는 명칭(= 식별자, identifier)같은 요소를 포함하는 개념이다.
declarator가 따르는 형태의 선언에서
동일한 tag 명칭이 보임 | 동일한 tag 명칭이 보이지 않음 |
---|---|
호환 O | incomplete type |
struct foo
{
/*member declaration*/
};
struct foo object; /*멤버 선언 없이, declarator(선언자)가 따르는 형태의 구조체 선언 */
struct foo *object; /*멤버 선언 없이, declarator(선언자)가 따르는 형태의 구조체 선언 */
struct foo
{
int a;
}
struct foo *object;
선언에서 foo가 보이지 않는다.struct foo *objcet;
에서 *object
가 declarator에 해당한다.