คำตอบด่วน: เปลี่ยนint testlib()
เป็นint testlib(void)
เพื่อระบุว่าฟังก์ชั่นไม่มีข้อโต้แย้ง
ต้นแบบคือโดยความหมายการประกาศฟังก์ชั่นที่ระบุประเภท (s) ของอาร์กิวเมนต์ของฟังก์ชัน (s)
ประกาศฟังก์ชั่นที่ไม่ใช่ต้นแบบเช่น
int foo();
เป็นการประกาศแบบเก่าที่ไม่ได้ระบุจำนวนหรือประเภทของข้อโต้แย้ง (ก่อนมาตรฐาน 1989 ANSI C นี่เป็นประกาศประเภทฟังก์ชันเดียวที่มีในภาษา) คุณสามารถเรียกใช้ฟังก์ชันดังกล่าวด้วยจำนวนอาร์กิวเมนต์ที่กำหนดเองและคอมไพเลอร์ไม่จำเป็นต้องบ่น - แต่ถ้า การโทรไม่สอดคล้องกับคำจำกัดความโปรแกรมของคุณมีพฤติกรรมที่ไม่ได้กำหนด
สำหรับฟังก์ชั่นที่รับอาร์กิวเมนต์หนึ่งตัวขึ้นไปคุณสามารถระบุประเภทของแต่ละอาร์กิวเมนต์ในการประกาศ:
int bar(int x, double y);
ฟังก์ชั่นที่ไม่มีข้อโต้แย้งเป็นกรณีพิเศษ ในทางตรรกะวงเล็บว่างจะเป็นวิธีที่ดีในการระบุว่าอาร์กิวเมนต์ แต่มีการใช้ไวยากรณ์นั้นสำหรับการประกาศฟังก์ชันแบบเก่าดังนั้นคณะกรรมการ ANSI C จึงคิดค้นไวยากรณ์ใหม่โดยใช้void
คำหลัก:
int foo(void); /* foo takes no arguments */
ฟังก์ชั่นความหมาย (ซึ่งรวมถึงรหัสสำหรับสิ่งที่ฟังก์ชั่นที่ไม่จริง) นอกจากนี้ยังมีการประกาศ ในกรณีของคุณคุณมีสิ่งที่คล้ายกับ:
int testlib()
{
/* code that implements testlib */
}
testlib
นี้จะมีการประกาศที่ไม่ใช่แบบอย่างที่ดีสำหรับ ตามคำจำกัดความสิ่งนี้จะบอกคอมไพเลอร์ที่testlib
ไม่มีพารามิเตอร์ แต่เป็นการประกาศเพียงบอกคอมไพเลอร์ที่testlib
ใช้จำนวนและชนิดของอาร์กิวเมนต์ที่ไม่ระบุ แต่คงที่
ถ้าคุณเปลี่ยน()
การ(void)
ประกาศจะกลายเป็นแบบอย่างที่ดี
ข้อดีของต้นแบบคือถ้าคุณตั้งใจโทรtestlib
ด้วยอาร์กิวเมนต์หนึ่งตัวขึ้นไปคอมไพเลอร์จะวินิจฉัยข้อผิดพลาด
(C ++ มีกฎแตกต่างกันเล็กน้อย C ++ ไม่มีการประกาศฟังก์ชั่นแบบเก่าและวงเล็บว่างเปล่าโดยเฉพาะหมายความว่าฟังก์ชั่นไม่มีข้อโต้แย้ง C ++ รองรับ (void)
ไวยากรณ์เพื่อความสอดคล้องกับ C แต่ถ้าคุณต้องการรหัสของคุณเพื่อรวบรวมทั้ง C และ C ++ คุณควรใช้()
ใน C ++ และ(void)
ไวยากรณ์ใน C)