"int main (vooid)"? 어떻게 작동합니까?


135

최근에 작은 C 테스트 프로그램을 입력해야했으며 그 과정에서 실수 vooid대신을 (를) 사용하여 주 함수에서 철자를 잘못 입력했습니다 void.

그럼에도 불구하고 여전히 효과가있었습니다.

가장 작은 완전한 버전으로 줄이면 다음과 같이 끝났습니다.

int main (vooid) {
    return 42;
}

이것은 실제로 컴파일 ( gcc -Wall -o myprog myprog.c)을 수행하며 실행되면 42를 반환합니다.

이 유효한 코드는 정확히 무엇입니까?


다음은 bash내가하고있는 일을 보여주기 위해 껍질 에서 잘라내어 붙여 넣은 사본입니다 .

pax$ cat qq.c
int main (vooid) {
    return 42;
}

pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq

pax$ echo $?
42

단일 int매개 변수로 main을 정의 하면 Undefined Behavior 를 호출 합니다.
무슨

9
실제로, 나는 UB, @pmg에 대해 확신하지 못한다. ISO는 구체적으로 main표준 2 개의 표준으로부터 다른 가능성을 허용 합니다. 이식성을 위해 두 가지 중 하나를 사용해야하지만 UB가 여기에 적용되지는 않습니다.
paxdiablo

흠 : 호스팅 환경 main에서 두 가지 정식 형식 (2.1.2.2) 중 하나를 가져야합니다. 그러나 독립 환경에서 @pax가 맞습니다. 식별자 main는 특별한 것이 아닙니다. 함수로 사용되는 경우 모든 유형이 될 수 있으며 모든 유형의 매개 변수를 가질 수 있습니다.
pmg

2
C99에서 독립 실행 형은 완전히 구현 정의됩니다. 호스팅 된 섹션 5.1.2.2.1은 마지막에 "또는 다른 구현 정의 방식"으로 명시되어 있으므로 최소한 두 개의 정식 형식이 필요하지만 다른 형식도 가질 수 있습니다 (이로 인해 UNIXy int main (int argc, char *argv[], char *envp[]);를 준수 할 수 있음) ).
paxdiablo 2013

답변:


220

단순히 "구식"함수 선언 구문을 사용하고 있습니다. int이라는 매개 변수를 암시 적으로 선언하고 vooid있습니다.


2
이것은 사실 인 것 같습니다. "vooid = 42; return vooid;"를 추가하면 메인으로, 당신은 또한 42의 반환 값을 얻을 수 있습니다.
Jeff Ames

43
아아, 네 말이 맞아 내가 추가 -std=c99하면을 얻습니다 qq.c:1: warning: type of 'vooid' defaults to 'int'.
paxdiablo

70

myprog.c에 다음이 포함되어 있기 때문에 유효한 코드입니다.

int main (vooid) // vooid is of type int, allowed, and an alias for argc
{     
  return 42; // The answer to the Ultimate Question
} 

vooid에는 전달 된 인수의 수에 1을 더한 값이 포함됩니다 (예 :) argc. 따라서 실제로 수행 한 모든 작업은로 이름 argc을 바꾸는 것 vooid입니다.


11
당신이 "무효를 반환"하면 대신 실제로 1 + num을 제공합니다. 인수
Jeff Ames

6
@Jeff, 프로그램의 이름은 논쟁으로 간주되므로 +1
Martin Beckett

23

C에서 함수 인수의 기본 유형은 int입니다. 따라서 프로그램은 단어를 vooid로 취급하고 int main(int vooid)있으며 이는 완전히 유효한 코드입니다.


20

그것은 단지입니다 gcc -std=c89 -Wall -o qq qq.cgcc -std=gnu89 -Wall -o qq qq.c경고를 방출하지 않습니다. 다른 모든 표준은에 대한 암시 적 유형에 int대한 경고를 표시 합니다 vooid.

int main(chart)와 같은 방식으로 작동 int main (vooid)합니다.

return vooid; 명령 행 인수의 수를 리턴합니다.

데비안 테스트 시스템에서 gcc 4.4.5로 테스트했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.