Gần đây tôi đã phải gõ một chương trình kiểm tra C nhỏ và trong quá trình đó, tôi đã mắc một lỗi chính tả trong chức năng chính do vô tình sử dụng vooid
thay vì void
.
Vậy mà nó vẫn hoạt động.
Giảm nó xuống phiên bản hoàn chỉnh nhỏ nhất của nó, tôi đã kết thúc với:
int main (vooid) {
return 42;
}
Điều này thực sự biên dịch ( gcc -Wall -o myprog myprog.c
) và khi chạy, nó trả về 42.
Làm thế nào chính xác là mã hợp lệ này?
Đây là bản cắt và dán từ bash
vỏ của tôi để hiển thị những gì tôi đang làm:
pax$ cat qq.c
int main (vooid) {
return 42;
}
pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq
pax$ echo $?
42
main
từ hai tiêu chuẩn chính. Đối với tính di động, bạn nên sử dụng một trong hai điều đó nhưng tôi không nghĩ rằng UB áp dụng ở đây.
main
phải có một trong 2 dạng chính tắc (2.1.2.2). Nhưng bạn đúng @pax, trong môi trường tự do, định danh main
không có gì đặc biệt: nếu được sử dụng như một hàm, nó có thể thuộc bất kỳ loại nào và có bất kỳ số lượng tham số nào.
int main (int argc, char *argv[], char *envp[]);
tuân thủ ).
int
tham số duy nhất , bạn gọi Hành vi không xác định . Bất cứ điều gì cũng có thể xảy ra :)