広告スペース

第22回 プロトタイプ・マクロ

C言語のプロトタイプ宣言と#defineマクロの使い方を解説。

プロトタイプ宣言 ― 関数の「予告」

関数をmain関数より下に書きたいときは、先に「この関数があるよ」と予告(プロトタイプ宣言)が必要です。
#include<stdio.h>

int add(int a, int b);   // プロトタイプ宣言({}なし、;必須)

int main(void) {
  printf("%d\n", add(3,5));  // 先に使える
}

int add(int a, int b) {      // 定義は後でOK
  return a + b;
}

なぜプロトタイプが必要?

Cのコンパイラは上から順番にコードを読みます。未定義の関数に出会うと「そんな関数知らない」とエラー(または警告)。
NG例: プロトタイプもなくmainの後に関数定義 → 警告または引数チェックができない
3つの解決策:
  1. 関数をmainより上に書く
  2. mainの上にプロトタイプ宣言を書く(標準的)
  3. ヘッダファイル(.h)にプロトタイプを書いて#includeする

マクロ(#define) ― 定数や短縮記法

#define はコンパイル前に文字列置換を行う指令です。定数や短い関数の定義に使います。
#define PI 3.14159       // 定数マクロ
#define MAX_SIZE 100
#define SQ(x) ((x)*(x))   // 関数風マクロ

int main(void) {
  double area = PI * 2.0 * 2.0;
  int a[MAX_SIZE];
  printf("5^2 = %d\n", SQ(5)); // → ((5)*(5)) = 25
}
注意: マクロは単純置換です。SQ(x+1)((x+1)*(x+1)) となり、カッコを付けないと計算が壊れます。必ず全体と各引数をカッコで囲む

自分で書いてみよう ― プロトタイプ&マクロ

proto.c
出力
「実行」を押してください...
広告スペース

関連する講座

関数編
第20回 関数(基本)
C言語の関数の定義と呼び出し。引数・戻り値の仕組みを図解。
関数編
第21回 関数の深掘り
C言語の関数を深く理解。値渡し・コールスタック・再帰関数を解説。
関数編
第23回 グローバル変数
C言語のグローバル変数・スコープ・変数の寿命・static変数を解説。
← 前の講座
第21回 関数の深掘り
次の講座 →
第23回 グローバル変数

確認クイズ

この講座の理解度をチェックしましょう!

Q1. 関数プロトタイプ宣言の目的は?

関数の実体を定義する
コンパイラに関数の型情報を事前に知らせる
マクロを定義する

プロトタイプ宣言により、関数の定義より前に呼び出しがあっても、コンパイラが正しく型チェックできます。

Q2. #define PI 3.14 で定義されるのは?

変数
マクロ(定数)
関数

#define はプリプロセッサマクロで、コンパイル前にテキスト置換されます。変数ではないのでメモリを消費しません。

Q3. #include "myfile.h" と #include の違いは?

違いはない
検索するディレクトリが異なる
片方はC++専用

"" はカレントディレクトリから検索、<> はシステムの標準ディレクトリから検索します。自作ヘッダは "" を使います。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。