C และ C ++ แตกต่างกันในส่วนนี้
C 2011 มาตรฐานออนไลน์
6.7.6.3 ฟังก์ชั่นการประกาศ (รวมถึงต้นแบบ)
...
10 กรณีพิเศษของพารามิเตอร์ที่ไม่มีชื่อประเภทvoid
เป็นรายการเดียวในรายการระบุว่าฟังก์ชั่นไม่มีพารามิเตอร์
...
14 รายการตัวระบุประกาศเพียงตัวระบุของพารามิเตอร์ของฟังก์ชั่น รายการว่างในตัวประกาศฟังก์ชันที่เป็นส่วนหนึ่งของนิยามของฟังก์ชันนั้นระบุว่าฟังก์ชันนั้นไม่มีพารามิเตอร์ รายการว่างในตัวประกาศฟังก์ชันที่ไม่ได้เป็นส่วนหนึ่งของนิยามของฟังก์ชันนั้นระบุว่าไม่มีข้อมูลเกี่ยวกับจำนวนหรือชนิดของพารามิเตอร์ 145)
กล่าวโดยย่อรายการพารามิเตอร์ที่ว่างเปล่าในการประกาศฟังก์ชั่นบ่งชี้ว่าฟังก์ชั่นใช้จำนวนพารามิเตอร์ที่ไม่ได้ระบุในขณะที่รายการพารามิเตอร์ที่ว่างเปล่าในการกำหนดฟังก์ชั่นบ่งชี้ว่าฟังก์ชั่นไม่มีพารามิเตอร์
T foo( void ); // declaration, foo takes no parameters
T bar(); // declaration, bar takes an *unspecified* number of parameters
T foo( void ) { ... } // definition, foo takes no parameters
T bar() { ... } // definition, bar takes no parameters
เท่าที่เกี่ยวข้องกับ C คุณไม่ควรใช้รายการตัวระบุที่ว่างเปล่าในการประกาศฟังก์ชันหรือคำจำกัดความ หากฟังก์ชั่นไม่ได้ตั้งใจที่จะใช้พารามิเตอร์ใด ๆ ระบุว่าโดยใช้void
ในรายการพารามิเตอร์
ออนไลน์ C ++ มาตรฐาน
8.3.5 ฟังก์ชั่น [dcl.fct]
...
4 พารามิเตอร์-declaration -clauseจะกำหนดอาร์กิวเมนต์ที่สามารถระบุได้และการประมวลผลของมันเมื่อเรียกใช้ฟังก์ชัน [ หมายเหตุ: พารามิเตอร์ประกาศข้อใช้ในการแปลงข้อโต้แย้งที่ระบุไว้ในการเรียกใช้ฟังก์ชัน; ดู 5.2.2 - หมายเหตุท้าย ] หากพารามิเตอร์-declaration-clauseว่างเปล่าฟังก์ชันจะไม่มีข้อโต้แย้ง รายการพารามิเตอร์ประกอบด้วยพารามิเตอร์ที่ไม่มีชื่อเดียวซึ่งเป็นชนิดที่ไม่ขึ้นอยู่กับvoid
จะเทียบเท่ากับรายการพารามิเตอร์ที่ว่างเปล่า cv void
ยกเว้นกรณีพิเศษนี้พารามิเตอร์จะไม่มีประเภท ถ้าพารามิเตอร์ประกาศ - ข้อยุติด้วยจุดไข่ปลาหรือชุดพารามิเตอร์ฟังก์ชั่น (14.5.3) จำนวนของการขัดแย้งจะต้องเท่ากับหรือมากกว่าจำนวนของพารามิเตอร์ที่ไม่ได้มีอาร์กิวเมนต์เริ่มต้นและไม่ได้แพ็คพารามิเตอร์ฟังก์ชั่น ที่ไหนที่ถูกต้องทางไวยากรณ์และที่ "... " ไม่ได้เป็นส่วนหนึ่งของผู้ประกาศนามธรรม , ", ... " มีความหมายเหมือนกันกับ "... " [ ตัวอย่าง:การประกาศ int printf(const char*, ...);
ประกาศฟังก์ชั่นที่สามารถเรียกได้ด้วยตัวเลขและประเภทของอาร์กิวเมนต์ที่แตกต่างกัน printf("hello world");
printf("a=%d b=%d", a, b);
อย่างไรก็ตามอาร์กิวเมนต์แรกจะต้องเป็นประเภทที่สามารถแปลงเป็นตัวอย่างconst char*
- end ] [ หมายเหตุ:ส่วนหัวมาตรฐาน<cstdarg>
มีกลไกสำหรับการเข้าถึงอาร์กิวเมนต์ที่ส่งผ่านโดยใช้จุดไข่ปลา (ดู 5.2.2 และ 18.10) - บันทึกท้าย ]
ในกรณีของ C ++ void
รายการพารามิเตอร์ที่ว่างเปล่าทั้งในการประกาศหรือคำนิยามที่บ่งชี้ว่าการทำงานจะเกิดการขัดแย้งใดและเทียบเท่ากับการใช้รายการพารามิเตอร์ของ