2017-10-10 8 views
3

다음 코드에서는 구조체 멤버 변수를 구조체 이름과 동일한 이름으로 선언했습니다.왜 컴파일러에서 충돌하는 오류가 발생하지 않습니까?

struct st 
{  
    int st; 
}; 

int main() 
{ 
    struct st t; 
    t.st = 7; 
    return 0; 
} 

가 나는 GCC 컴파일러에서 잘 일하고과 충돌 오류를 제공하지 않습니다 궁금하다.

그래서,

  • 어떻게 구조 이름과 변수 이름을 컴파일러 알고 있나요?
  • 내부적으로 어떤 메커니즘의 컴파일러가 사용합니까?
+0

'main()'은 무엇을 반환합니까? – joop

+5

변수와 구조체 이름은 KnR에서 시작하는 모든 C 컴파일러의 엔티티입니다. 원하는 경우 다른 이름 공간의 정렬. 그래서 그것은 정상입니다. – Matt

+0

'struct'는 컴파일러에게 다음'st'를'st' 값을 갖는 struct로 토큰 화하도록합니다. 마찬가지로 멤버'int st'는 이름이'st' 인'int' 변수로 선언됩니다. 그들의 사용법은 직각이므로 컴파일러는 어휘 분석 중에 혼란 스러울 수 없습니다. –

답변

9

예, 유효합니다. 구조체 태그와 구조체 멤버가 다른 네임 스페이스에 있습니다.

C11, 6.2.3 Name spaces of identifiers

:

특정 식별자 이상의 선언 번역 부에 임의의 지점에서 볼 경우, 구문 문맥 다른 엔티티들을 참조 용도들의 차이. 따라서 다음과 같이 식별자의 다양한 범주에 대한 별도의 네임 스페이스가 있습니다.

  • 레이블 이름 (레이블 선언 및 사용 구문으로 명확하게 구분).
  • 키워드 struct, union 또는 enum의 구조체, 공용체 및 열거 형의 태그 (any32 다음에 명확하게 표시)
  • 구조체 또는 공용체의 멤버. 각 구조체 또는 공용체는 멤버에 대해 별도의 네임 스페이스를 갖습니다 (. 또는 -> 연산자를 통해 멤버에 액세스하는 데 사용되는 표현식 유형으로 명확하게 구분됩니다).
  • 일반 식별자 (일반 선언자 또는 열거 상수로 선언 됨)라고하는 다른 모든 식별자.
3

구조 유형의 이름은 struct st입니다. st뿐만 아니라 충돌이 전혀 없습니다.