C言語変参の実現


今日はプロジェクト中のログ印刷部分のエラーを特定したいと思っていたが、変参の個数が一致しないときにwarningやerrorをコンパイルしようとしたが、残念ながら半日も実現しなかった.
個人テスト実装のパラメータ関数コードは以下の通りであり,テストコードであるが,パラメータの実装過程も基本的に明記されており,注意すべき問題や関連要点は注釈に記載されており,以下にコードを載せる.
もし誰かが私の上で述べたwarningとerrorの生成提案を出すことができたら、伝言を歓迎したり、私信交流をしたりしてください.くだらないことは言わないで、コードをつけて、直接g++variable_arg.cppコンパイルに成功しました.
/* 
 * File:   variable_arg.cpp
 * Author: Carl
 *
 * Created on August 28, 2012, 5:25 PM
 */

#include <cstdlib>
#include <cstdio>
#include <stdarg.h>
#include <cstring>

using namespace std;

/*
 * 1)C                         。
 * 2)       。  ,va_arg      double,     int     10,    
 * 3)C         。    , va_arg   float double   type double,   char,short int   type int
 * 4)       ,   typedef   
 */

void miniprintf(const char *fmt, ...)
{
    va_list ap; //      ,      ,  char  (             ,     ),       char     
    int d;
    char c, *p, *s;
    double f;

    //   va_list,                       ,  va_list    ,             , va_list           
    va_start(ap, fmt); //ap     (   0 )  ,fmt     
    while (*fmt)
    {
        if (*fmt != '%') //        
        {
            putchar(*fmt++);
            continue;
        }
        fmt++; //     ,++  s,d        
        switch (*fmt++) //   ++,              ,   loop  
        {
            //                
        case 's':
            //va_arg,      va_list     type(     )     ,      
            s = va_arg(ap, char *);
            printf("%s", s);
            break;
        case 'd':
            d = va_arg(ap, int);
            printf("%d", d);
            break;
        case 'c':
            c = (char) va_arg(ap, int);
            printf("%c", c);
            break;
        case 'f':
            f = va_arg(ap, double);
            printf("%f", f);
            break;
        default: //         
            printf("the format [%c] is not supported", *fmt);
            break;
        }
    }
    va_end(ap); //          ,   C   ,      va_start va_list     
    return;
}

double sum(int lim, ...)
{
    va_list ap;
    double total = 0;
    int i;
    va_start(ap, lim);
    for (i = 0; i < lim; i++)
    {
        total += va_arg(ap, double); //        
    }

    va_end(ap);
    return total;
}

int main(int argc, char** argv)
{
    char str[10];
    memset(str, 0, sizeof (str));
    memcpy(str, "hello", 5);
    miniprintf("this is the string \"%s\", 
this is the int %d,
this is the character %c
", str, 3, 'a'); double total = 0; total = sum(5, 10.0, 20.0, 30.0, 40.0, 50.0); // 10,20 int , miniprintf("total is %f
", total); return 0; }

実行結果は次のとおりです.
this is the string "hello", 
this is the int 3, 
this is the character a
total is 150.000000

レベルが限られています.もし友达が間違いを発見したら、伝言交流を歓迎します.
私の文章があなたを助けることができると思ったら、上记してください.ありがとうございます.