2011-02-10 5 views
4

함수 wait()가 다른 함수에서 선언되었습니다. 그것은 합법적입니까?이 코드 세그먼트는 C에서 유효합니까?

void panic(const int reason, const char *strg) 
{ 
int ErrNo; 
struct machine_attributes mach; 
int ret, docstat, cnt; 
pid_t pid, wait(int *), setsid(void); 
    ...... 
} 

고마워요!

+1

일부 컴파일러 확장이 허용하는 C의 함수는 다른 함수의 내부에서 정의 될 수 없습니다. – templatetypedef

+3

@templatetypedef : 아니요, 다른 함수 안에서 선언 할 수 있습니다. –

+0

@Charles Bailey- Ah, 잊어 버렸습니다. 그 forward-declaration은 단지 선언이 나타나는 함수에만 적용되는 것이 아닌가? 국부적 인 구조체 같이? 이것은 또 하나의 C (++) 엣지 경우입니다. – templatetypedef

답변

6

예,이 선언이 함수의 실제 정의와 일치하는 한. wait라는 pid_tpid라는 이름의 함수 (int*을 복용하고 pid_t를 반환)하고 setsid이라는 함수 (매개 변수를 고려하지 않고 pid_t를 반환) :

pid_t pid, wait(int *), setsid(void); 

이 세 가지 엔티티를 선언합니다.

pid의 선언도 정의입니다.

+0

누가 이것을 왜곡했는지 설명해주십시오. – templatetypedef

+0

이 정답을 잘못 잘못 계산 한 사람이 그림자에서 나오고, 자신을 설명하고, 자신의 다운 그레이드를 제거하면 감사 할 것입니다. –

+0

내가 볼 수있는 주요 문제는 투표자가 투표를하는 동안 이유를 설명하는 데 관심이없는 대부분의 유권자들입니다. 그들은 각자가 실수를 이해하고 배우는 데 도움이되는 이유를 설명해야합니다. 아마 이번 호에 위키 포스트를 올릴 때입니다 !! – Mahesh

0

그렇습니다. 예를 들어 보통의 C (비 POSIX 지향) 소스 파일에 waitstatic 연결을 사용하는 경우 유용 할 수 있습니다. 갑자기 해당 파일의 함수에서 POSIX wait을 호출해야한다는 것을 알게되었습니다. 호출하는 함수에서 선언 범위를 지정하면 파일 범위 static의 정의 인 wait과 충돌하지 않습니다.

wait (또는 다른 기능)을 선언하지 않은 다른 헤더에서 pid_t을 얻을 수 있지만 다른 유형의 누락으로 인해 이런 트릭을 사용할 수없는 경우가 있습니다.

네, 일부는 이것을 언어의 끔찍한 해킹/악용이라고 부릅니다. :-)

관련 문제