■この記事の概要
この記事は、C言語のstatic関数におけるプロトタイプ宣言の省略について解説し、エラーの回避とコード効率化のポイントを示しています。
エディタのタグジャンプ機能を使って効率的にコードを管理する方法も紹介しています。
■static関数宣言を書いてバグる
#include <stdio.h>
static int func();//関数宣言
int main(void){
printf("%d\n",func());
printf("%d\n",func(1));
printf("%d\n",func(1,2));
printf("%d\n",func(1,2,3));
}
//関数定義
extern int func(int a,int b,int c){
return a+b+c;
}
このコードは、
3行目にstatic 関数宣言がありますが
古い形式の関数宣言なので
引数チェックをしません。
static int func();
➡古いK&R形式の関数宣言
static int func(void);
➡新しいプロトタイプ関数宣言
引数チェックをしないので
関数コールと関数定義で引数の数が違っても
コンパイル出来てしまい、
間違いに気が付きません。
■static関数プロトタイプ宣言が面倒
#include <stdio.h>
/*関数プロトタイプ宣言*/
static void a1(
void//業務でよく記述する関数引数のコメント
);
static void a21(
void//業務でよく記述する関数引数のコメント
);
static void a22(
void//業務でよく記述する関数引数のコメント
);
static void b1(
void//業務でよく記述する関数引数のコメント
);
/*関数の定義*/
int main(void){
puts(__func__);
a1();
b1();
}
static void a1(void){
puts(__func__);
a21();
a22();
}
static void a21(void){
puts(__func__);
}
static void a22(void){
puts(__func__);
}
static void b1(void){
puts(__func__);
}
業務で、
「ソースコードを上から下へ読めるようにmain()関数を上に書く」とルール化して、
static関数のプロトタイプ宣言を
何百行もコメント付きで記述するプロジェクトは多いですが、
無駄です。
そもそもC言語は関数コールがバンバン発生するので小説のように上から下へ読めません。
■呼び出しより先にstatic関数定義するとプロトタイプ宣言は書かなくてOK
#include <stdio.h>
static void a21(void){
puts(__func__);
}
static void a22(void){
puts(__func__);
}
static void a1(void){
puts(__func__);
a21();
a22();
}
static void b1(void){
puts(__func__);
}
int main(void){
puts(__func__);
a1();
b1();
}
関数の定義がプロトタイプ宣言を兼ねるので
同じ事を2回書かなくて済むので楽です。
■static関数のプロトタイプ宣言を書いている暇のある人は
●Visual Studio Code環境の人は以下を学習
(1)F12キーの使い方
(2)”呼び出し階層の表示”
●Linux系環境の人は以下を学習
(1)cflow コマンドの使い方
(2)vim+ctagsコマンドの使い方
⇒CTRL+]によるタグジャンプ
main() <int main (void) at f1.c:16>:
puts()
a1() <void a1 (void) at f1.c:21>:
puts()
a21() <void a21 (void) at f1.c:26>:
puts()
a22() <void a22 (void) at f1.c:29>:
puts()
b1() <void b1 (void) at f1.c:32>:
puts()
■エディタのタグジャンプ機能を学習しよう。
プロトタイプ宣言と関数定義で
同じ事を2回書く暇があれば、
エディタのタグジャンプ機能を学習しよう。