はじめに
初級(前編)(後編)、中級と続いて、いよいよ上級編まできました☺️
C言語 〜上級〜
C言語を扱う上で必須ではありませんが、より実践的な手法を紹介します。
関数マクロ
#define 定義名 定義値
#defineは、値に名前を付けるだけでなく、処理を書くことも可能です。
正確には、ソースコードのビルド時に定義名を定義値に置き換えています。
処理を書くとは、たとえば以下のようなことです。
#include <stdio.h>
#define ADDVAL(n1,n2) \
int ret = 0; \
ret = ((n1)+(n2)); \
printf(“ret = %d\n”, ret);
int main(void)
{
ADDVAL(1, 2);
return 0;
}
実行結果はこうなります。
ret = 3
引数2つを加算する関数マクロADDVALを定義しました。
複数行に分割する場合はバックスラッシュを使用します。
引数には型を指定しません。
見た目は通常の関数定義に似ていますが、関数とは異なり、ビルドした時点でmain関数のADDVALが定義値に記載した処理に置き換わっています。
つまり、main関数を以下のように書いたものと解釈されます。
int main(void)
{
int ret = 0;
ret = 1 + 2;
printf(“ret = %d\n”, ret);
return 0;
}
このため、置き換え後に文法として成立する書き方でないと、ビルドエラーとなります。
便利な機能ではありますが、定義値の部分を単純に置き換えるが故の注意点もあるため、扱いには気をつけましょう。
注意点:
・引数に型を指定しないため、予期せぬ演算結果になる可能性がある
・デバッグが困難
などなど
関数ポインタ
中級のポインタの章で、関数もメモリ上にロードされ、アドレスが割り当てられるというお話をしました。
詳しく見てみます。
#include <stdio.h>
int addval(int n1, int n2);
int (*p_calc)(int n1, int n2); //ポインタ関数
int addval(int n1, int n2)
{
int ret;
ret = n1 + n2;
return ret;
}
int main(void)
{
int result = 0;
p_calc = addval; //p_calcはaddvalのアドレスを参照するようにする
result = p_calc(1, 2); //p_calcを介してaddvalを実行する
printf(“result=%d\n”, result);
return 0;
}
実行結果はこうなります。
result=3
ポインタ関数p_calcを定義しました。
関数名は何でも良いのですが、引数は使いたい関数に合わせる必要があります。
p_calc = addval; によって、p_calcにaddvalのアドレスを設定することで、p_calcを介してaddvalを呼び出すことができます。
関数ポインタは配列にすることもできます。ただし、引数は揃える必要があります。
#include <stdio.h>
int addval(int n1, int n2);
int multival(int n1, int n2);
int addval(int n1, int n2)
{
int ret;
ret = n1 + n2; //加算
return ret;
}
int multival(int n1, int n2)
{
int ret;
ret = n1 * n2; //乗算
return ret;
}
int main(void)
{
int result = 0;
int (*p_calc[])(int n1, int n2) = {addval, multival}; p_calc[0]にaddval、p_calc[1]にmultivalを設定
for(int i=0; i<2; i++){
result = p_calc[i](i+1, i+2); //p_calcを介して関数実行
printf(“p_calc[%d] result = %d\n”, i, result);
}
return 0;
}
実行結果はこうなります。
p_calc[0] result = 3
p_calc[1] result = 6
2つの引数を加算するaddvalと、同じく2つの引数を乗算する関数を用意しました。
int (*p_calc[])(int n1, int n2) = {addval, multival};
これによって、p_calc[0]でaddvalを、p_calc[1]でmultivalを使用可能となります。
要素番号をfor文のカウンタで指定することで、連続実行することなどができます。
さいごに
より実践的な使用方法のお話しでした。
これまでお伝えした機能を使えば、だいたいのコードは書けるようになっていると思います。
しかし、実はお伝えしていない機能もまだあるのです。それらについても追々書いていこうと思っています。
それでは、C言語については一旦以上とさせていただきます。
ありがとうございました😊
コメント