LoginSignup
5

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-12-24

はじめに

この記事は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++使ってください.

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5