Trả lời nhanh: thay đổi int testlib()
thành int testlib(void)
để chỉ định rằng hàm không có đối số.
A nguyên mẫu theo định nghĩa là khai báo hàm xác định loại (s) của đối số của hàm.
Một khai báo hàm phi nguyên mẫu như
int foo();
là một tuyên bố kiểu cũ mà không ghi rõ số điện thoại hoặc các loại đối số. (Trước tiêu chuẩn ANSI C 1989, đây là kiểu khai báo hàm duy nhất có sẵn trong ngôn ngữ.) Bạn có thể gọi một hàm như vậy với bất kỳ số lượng đối số tùy ý nào, và trình biên dịch không bắt buộc phải phàn nàn - nhưng nếu cuộc gọi không nhất quán với định nghĩa , chương trình của bạn có hành vi không xác định.
Đối với một hàm mang theo một hoặc nhiều đối số, bạn có thể chỉ định kiểu của mỗi tham số trong khai báo:
int bar(int x, double y);
Chức năng không có đối số là một trường hợp đặc biệt. Một cách logic, dấu ngoặc rỗng sẽ là một cách tốt để xác định rằng một cuộc tranh cãi nhưng cú pháp đó là đã được sử dụng cho các tờ khai chức năng kiểu cũ, vì vậy ban ANSI C phát minh ra một cú pháp mới sử dụng void
keyword:
int foo(void); /* foo takes no arguments */
Hàm định nghĩa (bao gồm mã cho chức năng thực sự thực hiện) cũng cung cấp khai báo . Trong trường hợp của bạn, bạn có điều gì đó tương tự như:
int testlib()
{
/* code that implements testlib */
}
Điều này cung cấp tuyên bố không nguyên mẫu cho testlib
. Như một định nghĩa, điều này nói với trình biên dịch rằng testlib
không có tham số, nhưng như là một khai báo, nó chỉ nói với trình biên dịch rằng testlib
có một số không xác định nhưng cố định và kiểu (s) của đối số.
Nếu bạn thay đổi ()
thành (void)
tuyên bố trở thành mẫu thử nghiệm.
Lợi thế của nguyên mẫu là nếu bạn vô tình gọi testlib
với một hoặc nhiều đối số, trình biên dịch sẽ chẩn đoán lỗi.
(C++ có các quy tắc hơi khác nhau. C++ không có khai báo hàm kiểu cũ và dấu ngoặc đơn trống có nghĩa là hàm không có đối số. C++ hỗ trợ cú pháp (void)
cho tính nhất quán với C. Nhưng trừ khi bạn cần mã để biên dịch cả C và C++, có lẽ bạn nên sử dụng số ()
trong C++ và cú pháp (void)
trong C.)
Xóa extern khỏi khai báo trong mylib.h Đặc biệt nếu bạn đang viết một chương trình C thuần túy, thì bên ngoài tuyên bố là không cần thiết ở đó. –