최근에 작은 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
main
표준 2 개의 표준으로부터 다른 가능성을 허용 합니다. 이식성을 위해 두 가지 중 하나를 사용해야하지만 UB가 여기에 적용되지는 않습니다.
main
에서 두 가지 정식 형식 (2.1.2.2) 중 하나를 가져야합니다. 그러나 독립 환경에서 @pax가 맞습니다. 식별자 main
는 특별한 것이 아닙니다. 함수로 사용되는 경우 모든 유형이 될 수 있으며 모든 유형의 매개 변수를 가질 수 있습니다.
int main (int argc, char *argv[], char *envp[]);
를 준수 할 수 있음) ).
int
매개 변수로 main을 정의 하면 Undefined Behavior 를 호출 합니다.