C語言中不定參數(shù)?...?的語法以及函數(shù)封裝
Intro
有一天看C代碼看到某個方法有這樣的定義:在函數(shù)形參列表處,有...的寫法,就像Java中的不定參數(shù)那樣。
如:
int printf(const char * __restrict, ...) __printflike(1, 2); int scanf(const char * __restrict, ...) __scanflike(1, 2);

那么C語言中的不定參數(shù)特性,是怎樣使用的呢,以及我們如何利用該特性,封裝自己的函數(shù)?
語法測試
依賴庫
需要用到 stdarg.h 中的三個函數(shù):
#define va_start(ap, param) __builtin_va_start(ap, param) #define va_end(ap) __builtin_va_end(ap) #define va_arg(ap, type) __builtin_va_arg(ap, type)

新函數(shù)使用測試:遍歷并打印不定參數(shù)中的值
主要是測試一下上面提到的三個庫函數(shù)的使用。
#include <stdio.h>
#include <stdarg.h>
// 聲明列表的結束值
#define ARGUMENTS_END_VALUE -1
void printMultiArgs(int firstArgs, ...) {
// 聲明參數(shù)列表的變量
va_list ap;
// 初始化參數(shù)列表
va_start(ap, firstArgs);
printf("%d\n", firstArgs);
int currValue;
while ((currValue = va_arg(ap, int)) != ARGUMENTS_END_VALUE) {
printf("%d\n", currValue);
}
// 結束參數(shù)列表
va_end(ap);
}
int main(int argc, const char * argv[]) {
printMultiArgs(1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE);
return 0;
}
用兩種方式封裝函數(shù):對多個int值求和
//
// main.c
// C不定參數(shù)
//
// Created by wuyujin1997 on 2023/1/23.
//
//#define va_start(ap, param) __builtin_va_start(ap, param)
//#define va_end(ap) __builtin_va_end(ap)
//#define va_arg(ap, type) __builtin_va_arg(ap, type)
#include <stdio.h>
#include <stdarg.h>
// 聲明列表的結束值
#define ARGUMENTS_END_VALUE -1
void printMultiArgs(int firstArgs, ...) {
// 聲明參數(shù)列表的變量
va_list ap;
// 初始化參數(shù)列表
va_start(ap, firstArgs);
printf("%d\n", firstArgs);
int currValue;
while ((currValue = va_arg(ap, int)) != ARGUMENTS_END_VALUE) {
printf("%d\n", currValue);
}
// 結束參數(shù)列表
va_end(ap);
}
/// 對多個int變量求和(需要提前約定好參數(shù)結束的標志值 ARGUMENTS_END_VALUE)
/// - Parameter firstArgs: <#firstArgs description#>
int sum1(int firstArgs, ...) {
int result = 0;
va_list ap;
va_start(ap, firstArgs);
result+= firstArgs; // 手動處理第一個參數(shù)
int currValue;
while ((currValue = va_arg(ap, int)) != ARGUMENTS_END_VALUE) {
result += currValue;
}
va_end(ap);
return result;
}
/// 對多個int變量求和(需要主動本方法:不定參數(shù)的個數(shù)是多少)
/// - Parameters:
/// - count: 不定參數(shù)的個數(shù)
/// - firstArgs: 第一個參數(shù),顯式的形參
int sum2(int count, int firstArgs, ...) {
int result = 0;
va_list ap;
va_start(ap, firstArgs);
result += firstArgs;
for (int i = 1; i < count; i++) {
int currValue = va_arg(ap, int);
// printf("%d %d\n", i, currValue);
result += currValue;
}
va_end(ap);
return result;
}
int main(int argc, const char * argv[]) {
printMultiArgs(1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE);
printf("sum1 %d\n", sum1(1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE));
int LENGTH = 9;
printf("sum2 %d\n", sum2(LENGTH, 1,2,3,4,5,6,7,8,9, ARGUMENTS_END_VALUE));
return 0;
}執(zhí)行結果:

總結
- 需要引入頭文件 #include <stdarg.h>
- 一個新類型,三個新函數(shù)
- 類型 va_list
- 函數(shù),其中 ap 為 va_list 類型的變量。
- va_start(ap, param) param為不定參數(shù)列表的第一個參數(shù)。
- va_arg(ap, type) 不定參數(shù)中變量的類型嗎,如int, short, long 等。
- va_end(ap)
- 如何確定 va_arg 的size/有多少個元素? 沒有原生的屬性/變量可以告訴我們。
- 約定一個值作為 end_value ,而且要保證:這個值不會出現(xiàn)在傳入的多個參數(shù)值中。
- 在咱自己封裝的函數(shù)中,新增一個參數(shù)用于告知被調函數(shù)內部:本次不定參數(shù)的size是多少。
- 注意不定參數(shù)的類型匹配。
總結
到此這篇關于C語言中不定參數(shù) ... 的語法以及函數(shù)封裝的文章就介紹到這了,更多相關C語言不定參數(shù) ...內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言中static的作用及C語言中使用靜態(tài)函數(shù)有何好處
在C語言中,static的作用有三條:一是隱藏功能,二是保持持久性功能,三是默認初始化為0。本文重點給大家介紹C語言中static的作用及c語言中使用靜態(tài)函數(shù)有何好處,對本文感興趣的朋友一起看看吧2015-11-11
C++容器std::vector的swap()函數(shù)使用方式
這篇文章主要介紹了C++容器std::vector的swap()函數(shù)使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
Visual?Studio?2022?配置?PCL?1.12.1?的問題小結
這篇文章主要介紹了Visual?Studio?2022?配置?PCL?1.12.1?的經(jīng)驗總結分享,本文通過圖文實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08
C++深入分析數(shù)據(jù)在內存中的存儲形態(tài)
使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內存位置。這意味著,當您創(chuàng)建一個變量時,就會在內存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內存和決定在保留內存中存儲什么2023-01-01
詳解C語言中typedef和#define的用法與區(qū)別
這篇文章主要給大家介紹了關于C語言中typedef和#define的的用法、區(qū)別,以及陷阱。文中通過示例進行了詳細講解,感興趣的小伙伴可以了解一下2022-07-07

