Bạn đang tìm định nghĩa c/C++ về số lượng đối số vô hạn cho hàm. Bạn có thể xem tại đây - http://www.cplusplus.com/reference/cstdarg/va_start/
Một cách dễ dàng để thực hiện một chức năng như vậy là như thế:
1- xác định chức năng của bạn ví dụ
void logging(const char *_string, int numArgs, ...)
tranh luận đầu tiên là chuỗi bạn muốn sử dụng .
Đối số thứ hai là số đối số vô hạn mà bạn muốn cung cấp. Bạn không cần phải sử dụng tham số này, nếu bạn muốn đếm phần giữ chỗ trong một công tắc (như% d,% f trong printf) -Hint: trong một vòng lặp nhận được mọi char và xem nếu nó là trình giữ chỗ của bạn-.
tôi muốn cung cấp đầu tiên một ví dụ làm thế nào bạn có thể gọi một chức năng như:
logging("Hello %0. %1 %2 %3", "world", "nice", "to", "meet you"); // infinite arguments are "world", "nice", ... you can give as much as you want
Như bạn thấy placeholders của tôi là những con số. Bạn có thể sử dụng bất cứ điều gì bạn muốn.
2- Có macro, khởi tạo biến danh sách và nhận được giá trị của một cuộc tranh cãi:
va_list arguments; // define the list
va_start(arguments, numArgs); // initialize it, Note: second argument is the last parameter in function, here numArgs
for (int x = 0; x < numArgs; x++) // in a loop
{
// Note : va_arg(..) gets an element from the stack once, dont call it twice, or else you will get the next argument-value from the stack
char *msg = va_arg(arguments, char *); // get "infinite argument"-value Note: Second parameter is the type of the "infinite argument".
... // Now you can do whatever you want - for example : search "%0" in the string and replace with msg
}
va_end (arguments); // we must end the listing
Nếu bạn thay thế từng giữ chỗ với các giá trị tham số vô hạn và in ra chuỗi mới, bạn sẽ thấy điều này :
Xin chào mọi người. nice to meet you
Tôi hy vọng rằng sẽ giúp ...
OK nhưng tại sao tôi lại nhớ việc sử dụng ...? – Bosak
@Bosak: Đó là cách nó được thực hiện trong Java (mặc dù '...' xuất hiện sau tên kiểu). –
Ồ bạn có thể đúng. Tôi không biết Java nhưng tôi đã từng xem một clip về một cái gì đó trong Java và vì nó rất giống C# Tôi nhầm lẫn nó. – Bosak