Help us understand the problem. What is going on with this article?

C言語でオーバーロードを実装してみた

More than 1 year has passed since last update.

はじめに

この記事はMITAdoventCalendarの24日目の記事です.
クリスマスイブです.

そもそもオーバーロードとは

JavaやC++,C#などの言語には引数の違いによって同名の関数を呼ぶときに動作を変えることができます.これを関数のオーバーロードと言います.もちろんC言語にオーバーロードは実装されていませんが,作ってみました

#include <stdio.h>
#include <stdarg.h>//可変長引数周りのライブラリのインクルード
void func(int count,...);//呼び出す関数
void nfunc();//func内部で呼び出す関数
void yfunc(char *name);//func内部で呼び出す関数
int main(void){
    int partner;
    char name[100];
    printf("クリスマスイブですが彼女いますか?????\nNo:0,Yes:1\n");
    scanf("%d",&partner);
    if(partner==1){//引数が二つの時
        printf("彼女の名前は?\n");
        scanf("%99s",name);
        func(1, name);
    }
    else{//引数が一つのとき
        func(0);
    }

    return 0;

}
void func(int count,...){//...によって引数が可変になる(stdarg.hが必要)
    va_list ap;//stdarg.h内部で定義される可変長配列のリスト
    if(count==0){//引数が一つの時
        nfunc();
    }
    else{//引数が二つの時
        va_start(ap,count);//可変長引数のリストと可変長配列の長さで可変長配列を初期化
        yfunc(va_arg(ap,char*));//可変長配列から文字列を取り出す
        va_end(ap);
    }
}
void nfunc(){
    printf("悲しい人生だな\n");
}
void yfunc(char *name){
    printf("%sともども爆発しろ!\n",name);
}

実行結果

No:0,Yes:1
0
悲しい人生だな

No:0,Yes:1
1
彼女の名前は?
紺野木綿季
紺野木綿季ともども爆発しろ!

解説

コメントになるべく説明を書きましたがstdarg.hによってまず引数を可変長にします.
引数の個数で別名の関数をいくつか作っておいてfunc関数の内部で対応する関数をif文で呼び出します.
これによって引数の個数によって擬似的に関数のオーバーロードを実装できます.

終わりに

これなら最初から大人しくC++使ってください.

nayuta_1999
PHPとかDockerとか楽しいですね
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした