บางครั้ง คุณอาจเจอสถานการณ์หนึ่ง เมื่อคุณต้องการมีฟังก์ชัน ซึ่งสามารถรับจำนวนตัวแปรของอาร์กิวเมนต์ เช่น พารามิเตอร์ แทนที่จะเป็นจำนวนพารามิเตอร์ที่กำหนดไว้ล่วงหน้า ภาษาการเขียนโปรแกรม C/C++ จัดเตรียมวิธีแก้ปัญหาสำหรับสถานการณ์นี้ และคุณได้รับอนุญาตให้กำหนดฟังก์ชันที่ยอมรับตัวแปรจำนวนตัวแปรตามความต้องการของคุณ ตัวอย่างต่อไปนี้แสดงคำจำกัดความของฟังก์ชันดังกล่าว
int func(int, ... ) { . . . } int main() { func(1, 2, 3); func(1, 2, 3, 4); }
ควรสังเกตว่าฟังก์ชัน func() มีอาร์กิวเมนต์สุดท้ายเป็นวงรี กล่าวคือ สามจุด (...) และจุดก่อนหน้าจุดไข่ปลาจะเป็น int เสมอ ซึ่งจะแสดงจำนวนอาร์กิวเมนต์ตัวแปรทั้งหมดที่ส่งผ่าน ในการใช้ฟังก์ชันดังกล่าว คุณต้องใช้ไฟล์ส่วนหัว stdarg.h ซึ่งมีฟังก์ชันและมาโครเพื่อใช้งานฟังก์ชันของอาร์กิวเมนต์ตัวแปรและทำตามขั้นตอนที่กำหนด -
-
กำหนดฟังก์ชันที่มีพารามิเตอร์ตัวสุดท้ายเป็นวงรี และตัวก่อนจุดไข่ปลาจะเป็น int เสมอ ซึ่งจะแสดงจำนวนอาร์กิวเมนต์
-
สร้าง va_list พิมพ์ตัวแปรในนิยามฟังก์ชัน ประเภทนี้ถูกกำหนดไว้ในไฟล์ส่วนหัว stdarg.h
-
ใช้ int พารามิเตอร์และ va_start มาโครเพื่อเริ่มต้น va_list ตัวแปรไปยังรายการอาร์กิวเมนต์ แมโคร va_start ถูกกำหนดในไฟล์ส่วนหัว stdarg.h
-
ใช้ va_arg มาโครและ va_list ตัวแปรเพื่อเข้าถึงแต่ละรายการในรายการอาร์กิวเมนต์
-
ใช้มาโคร va_end เพื่อล้างหน่วยความจำที่กำหนดให้กับ va_list ตัวแปร
ตอนนี้ให้เราทำตามขั้นตอนข้างต้นและเขียนฟังก์ชันง่าย ๆ ที่สามารถนำจำนวนตัวแปรของพารามิเตอร์และคืนค่าค่าเฉลี่ยของพวกมัน -
โค้ดตัวอย่าง
#include <iostream> #include <cstdarg> using namespace std; double average(int num,...) { va_list valist; double sum = 0.0; int i; va_start(valist, num); //initialize valist for num number of arguments for (i = 0; i < num; i++) { //access all the arguments assigned to valist sum += va_arg(valist, int); } va_end(valist); //clean memory reserved for valist return sum/num; } int main() { cout << "Average of 2, 3, 4, 5 = "<< average(4, 2,3,4,5) << endl; cout << "Average of 5, 10, 15 = "<< average(3, 5,10,15)<< endl; }
ผลลัพธ์
Average of 2, 3, 4, 5 = 3.5 Average of 5, 10, 15 = 10