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 vooidthay 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ừ bashvỏ 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
maintừ 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.
mainphả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 mainkhô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ủ ).
inttham 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 :)