#include "stdarg.h"

正寧網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。成都創(chuàng)新互聯(lián)公司于2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
//n表示輸入?yún)?shù),總的個數(shù),后面是各個元素的值
int va_add(int n,...)
{
va_list lst;
int i;
int t = 0;
va_start(lst,n);
for (i = 0; i n; i++)
{
int c = va_arg(lst, int);
printf("%d: %d\n", c);
t += c;
}
return t;
}
int main()
{
int t = va_add(4,1,2,3,4);
printf("Sum is:%d\n", t);
getch();
return 0;
}
說的有點混亂,提供幾個方法。1,你的WHILE另開一個線程.2做一個LIST保存每個LOG的信息,每個信息是NEW出來的。
說實話,我還是沒明白你補(bǔ)充的意思。
我寫個偽代碼吧,希望能有點啟發(fā)
list LOG_INFO* info_list;
while ()
{
...//some function
//new出來的東西在堆上,不會被釋放掉,所以一直都存在
LOG_INFO* log_info = new LOG_INFO();
//放到煉表里保存指針
info_list.push_back(log_info);
...//some function
}
output_log(info_list);//把煉表給輸出的函數(shù)
release_info(info_list);//釋放new的東西。
基本是這個意思,就是你new出來的東西不會被釋放.
另外log_info可以是一個類,里面變的東西都可以設(shè)置,當(dāng)然有的東西沒有可以不設(shè)置.因為具體問題不清楚,所以可能更優(yōu)化.
而輸出的時候是根據(jù)類里面的成員變量進(jìn)行輸出的.
舉例:
比如可能輸出的是字符串也可能輸出圖片那么可以定義如下
class Info
{
string str;
Image image;
bool is_str;
bool is_image;
}
然后判斷到底有什么,當(dāng)然也可以用指針等其他方法進(jìn)行數(shù)據(jù)結(jié)構(gòu)的優(yōu)化.
/*
*printf.c - print formatted
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines printf() - print formatted data
*
*******************************************************************************/
#include cruntime.h
#include stdio.h
#include dbgint.h
#include stdarg.h
#include file2.h
#include internal.h
#include mtdll.h
/***
*int printf(format, ...) - print formatted data
*
*Purpose:
* Prints formatted data on stdout using the format string to
* format data and getting as many arguments as called for
* Uses temporary buffering to improve efficiency.
* _output does the real work here
*
*Entry:
* char *format - format string to control data format/number of arguments
* followed by list of arguments, number and type controlled by
* format string
*
*Exit:
* returns number of characters printed
*
*Exceptions:
*
*******************************************************************************/
int __cdecl printf (
const char *format,
...
)
/*
* stdout 'PRINT', 'F'ormatted
*/
{
va_list arglist;
int buffing;
int retval;
va_start(arglist, format);
_ASSERTE(format != NULL);
#ifdef _MT
_lock_str2(1, stdout);
__try {
#endif /* _MT */
buffing = _stbuf(stdout);
retval = _output(stdout,format,arglist);
_ftbuf(buffing, stdout);
#ifdef _MT
}
__finally {
_unlock_str2(1, stdout);
}
#endif /* _MT */
return(retval);
}
首先先看到main函數(shù)中的不定參數(shù):
1.引用:在Turbo C2.0啟動過程中, 傳遞main()函數(shù)三個參數(shù): argc, argv和env。
* argc: 整數(shù), 鴐ain()的命令行參數(shù)個數(shù)。
* argv: 字符串?dāng)?shù)組。
argv[0] 為程序運行的全路徑名
argv[1] 為在DOS命令行中執(zhí)行程序名后的第一個字符串;
argv[2] 為執(zhí)行程序名后的第二個字符串;
...
argv[argc]為NULL。
*env: 字符串?dāng)?shù)組。env[] 的每一個元素都包含ENVVAR=value形式的字符
串。其中ENVVAR為環(huán)境變量。value 為ENVVAR的對應(yīng)值
#include stdlib.h
#include stdio.h
main(int argc, char *argv[], char *env[])
{
int i;
printf("%d\n", argc); /* 為什么它的輸出是 1, 它到底是定義什么的,我看不明上面的解釋*/
for(i=0; i=argc; i++)
printf("argv[%d]:%s\n", i, argv[i]);
for(i=0; env[i]!=NULL; i++)
printf(" env[%d]:%s\n", i, env[i]);
}
argc, argv, env是在main()函數(shù)之前被賦值的,編譯器生成的可執(zhí)行文件,main()不是真正的入口點,而是一個標(biāo)準(zhǔn)的函數(shù),這個函數(shù)名與具體的操作系統(tǒng)有關(guān)。
就想到其他函數(shù)是否能實現(xiàn)一樣的功能,查詢了相關(guān)資料,基本上都是利用STDARG.H中的
#define va_start(ap, parmN) (ap = ...)
#define va_arg(ap, type) (*((type *)(ap))++)
#define va_end(ap)
定義如下:
typedef char * va_list;
#define va_start _crt_va_start
#define va_arg _crt_va_arg
#define va_end _crt_va_end
#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define _crt_va_end(ap) ( ap = (va_list)0 )
修改他人程序如下:
void average(int first,...)
{int i=first;
va_list maker;
va_start(maker,first);
while(i!=-1){ printf("%p: %d\n",maker,i);
i=va_arg(maker,int);
}
}
void main(void)
{
average(2,3,4,4,-1);
}
運行結(jié)果:
FFCE: 2
FFD0: 3
FFD2: 4
FFD4: 4
這個程序顯示函數(shù)參數(shù)的地址相差2個字節(jié)
所以可以改寫為:
void x(char *n,...)
{int *p;
p=n;
while(*p!=-1)
{printf("%p:%s\n",p,*p,*p);
p+=sizeof(char);}}
void main()
{x("g","hfd","gfg","vsds",-1);}
運行結(jié)果:
FFD2:g
FFD4:hfd
FFD6:gfg
FFD8:vsds
不必通過宏va_start,va_arg,va_end實現(xiàn)
C語言中定義了va_list, va_start( ), va_arg( ), va_end( ) 這樣一組宏來處理可變參數(shù)問題。
可以參考printf的聲明,創(chuàng)建自己的實現(xiàn)函數(shù)。示例:
#includestdio.h
#includestdarg.h
void?va_fun(int?start,...)
{
va_list?arg_ptr;
int?nArgValue?=?start;
int?nArgCount?=?1;
va_start(arg_ptr,start);
while(nArgValue?!=?-1)
{
printf("arg?%d?is:%d/n",nArgCount,nArgValue);
nArgValue=va_arg(arg_ptr,int);
++nArgCount;?
}
return;?
}
main()
{
va_fun(5,1,7,-1);
printf("................/n");
va_fun(2,4,-1);
printf("................/n");
va_fun(-1);
printf("................/n");
//va_fun();?可變參數(shù)函數(shù)最少要有一個參數(shù)。
}
很巧我現(xiàn)在正好也有實現(xiàn)這樣函數(shù)的需求,其實就是看了C語言可變參數(shù)函數(shù)的相關(guān)資料,你就差不多知道怎么實現(xiàn)了。
只不過其中有一個很重要的大坑,只要邁過去就沒問題。我是試了半天才明白的:
如果參數(shù)是char或float類型,這樣的參數(shù)放在可變參數(shù)部分的話,編譯器是會默認(rèn)把它們的類型提升為相應(yīng)的“全”類型的:char提升為int,float提升為double。如果你沒注意這一點就會出現(xiàn)錯誤。當(dāng)然可以通過指針的類型轉(zhuǎn)換來避免。
先簡略地點一下,等我在CSDN博客里詳細(xì)地寫一寫心得吧。雖然是N年前的問題估計樓主早就自己解決了,但希望能幫到其他人:)
網(wǎng)頁名稱:c語言函數(shù)參數(shù)不固定,c語言函數(shù)必須有參數(shù)
網(wǎng)頁鏈接:http://chinadenli.net/article0/dsgddoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、外貿(mào)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、網(wǎng)站排名、網(wǎng)站內(nèi)鏈、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)