C言語変参の実現
今日はプロジェクト中のログ印刷部分のエラーを特定したいと思っていたが、変参の個数が一致しないときにwarningやerrorをコンパイルしようとしたが、残念ながら半日も実現しなかった.
個人テスト実装のパラメータ関数コードは以下の通りであり,テストコードであるが,パラメータの実装過程も基本的に明記されており,注意すべき問題や関連要点は注釈に記載されており,以下にコードを載せる.
もし誰かが私の上で述べたwarningとerrorの生成提案を出すことができたら、伝言を歓迎したり、私信交流をしたりしてください.くだらないことは言わないで、コードをつけて、直接g++variable_arg.cppコンパイルに成功しました.
実行結果は次のとおりです.
レベルが限られています.もし友达が間違いを発見したら、伝言交流を歓迎します.
私の文章があなたを助けることができると思ったら、上记してください.ありがとうございます.
個人テスト実装のパラメータ関数コードは以下の通りであり,テストコードであるが,パラメータの実装過程も基本的に明記されており,注意すべき問題や関連要点は注釈に記載されており,以下にコードを載せる.
もし誰かが私の上で述べた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
レベルが限られています.もし友达が間違いを発見したら、伝言交流を歓迎します.
私の文章があなたを助けることができると思ったら、上记してください.ありがとうございます.