2014-05-15 1 views
1

는 나는 일부 전자 파일에 다음 코드가 있습니다같은 이름의 구조체 두 개가 허용됩니까?

<' 
package my_package; 

struct packet { 
    foo() is { 
     print "Hello"; 
    }; 
}; 

'> 

그리고 내 정상 파일 수입이 일을 포함하여 여러 파일을, 그리고 어떤 점에서 그것은 foo는() 메서드를 호출합니다. 위의 파일 전에 상단을 가져옵니다 (난 그냥 내가 이미 "패킷"라는 구조체를하였습니다 잊었) 다른 파일에

struct packet {}; 

:

이제 실수로이 코드를 추가했습니다. 내가 정상 파일을로드하려고 할 때

이상하게도,이 오류가있어 :

*** Error: 'p' (of type main::packet) does not have 'foo()' method. 
       at line 9 in top.e 
     p.foo(); 

을하지만, 왜 foo는 정의 파일에 이미 실패하지 않았다()?

패킷에 대한 구조체 선언이 있지만 패킷이 이전 파일에서 이미 (실수로) 선언되었으므로 중복 된 형식 이름 오류가 발생하지 않은 이유는 무엇입니까? 동일한 이름을 가진 두 개의 구조체를 가질 수 있습니까?

답변

2

다른 구조체에는 같은 이름을 사용할 수 있지만 다른 패키지에 정의해야합니다. 귀하의 경우 먼저 my_package 패키지에 packet을 정의하십시오. 내가 추가 한 다른 코드가 라인에 package my_package;이없는 다른 파일에 있다고 추측합니다. 즉, main 패키지에 packet이라는 다른 구조체를 정의했습니다. 즉, my_package::structmain::struct의 두 가지 유형이 있음을 의미합니다. main::packet에서 사용자는 foo() 함수를 정의하지 않았습니다 (오류 메시지에서도 볼 수 있듯이). Yuti가 언급했듯이, top.e 파일에는 패키지가 선언되어 있지 않기 때문에 main 패키지가 다른 패키지보다 우선합니다.

운동으로, packet 대신에 my_package::packet 위로 코드를 변경하면 효과가 있습니다. 어쨌든 오류 메시지에서 잘못된 것이 있음을 알 수 있습니다. my_package::packet을 알았지 만 main::packet을 만들었습니다.

패키지에 대한 자세한 정보는 Specman e Language Reference, 28, Encapsulation Construct를보십시오.

3

사실, 기본 패키지가 우선하는 것은 아닙니다. 그러나 형식 이름이 일부 파일에서 사용되면이 파일이 속한 동일한 패키지가 우선 적용됩니다. 이 경우 top.e 파일에는 "package"문이 없을 것이므로 package main에도 속합니다. top.e에 "package my_package"가 있으면 "packet"이 my_package :: packet으로 해석되고 main :: packet으로 해석되지 않으며 오류가 발생하지 않습니다.

관련 문제