ユーニックス総合研究所

  • home
  • archives
  • c-global-kansu

C言語でグローバルに関数を使う方法

  • 作成日: 2022-08-16
  • 更新日: 2023-12-25
  • カテゴリ: C言語

グローバルな関数の定義方法

C言語で関数を定義するときに、その関数を色々なモジュールから使いたいと考えることは多いかと思います。
つまり関数をグローバルに使いたいわけですね。
C言語ではそういう時に関数のプロトタイプをヘッダーファイルに用意します。
そして関数を使いたいモジュールがそのヘッダーファイルをインクルードします。

この記事では関数をグローバルに使う方法を解説します。

関連記事

自作関数read_fileでファイルを読み込み【ファイル入出力, コマンド】
目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
明快!C言語のcontinue文の使い方
君はまだC言語のdefineのすべてを知らない【マクロ、プリプロセス】
プログラミングの関数とは?わかりやすく解説します

関数をグローバルにするポイント

関数をグローバルに使う際のポイントは↓の3つです。

  • 関数がstaticで定義されていないか
  • 関数のプロトタイプ宣言があるか
  • 関数の定義されているファイルが一緒にコンパイルされているか

関数をstaticで定義するとその関数は内部リンケージになります。
つまりそのファイルからしか参照できない関数になります。
関数をグローバルに扱いたい場合はstaticを書かないようにします。

関数のプロトタイプ宣言が無くても関数は実行できます。
しかしコンパイラが警告を出すのでプロトタイプ宣言は書いておいたほうが良いです。

そして関数が定義されているファイルが一緒にコンパイルされてないと関数は実行できません。
関数の本体が無いからですね。
これはコンパイルエラーになります。

helloモジュールを定義する

具体的に話を進めます。
では関数を定義してみましょう。

#include "hello.h"  

void hello(void) {  
    printf("Hello!\n");  
}  

↑のような関数をhello.cファイルに定義します。
そしてhello.hを↓のように定義します。

#pragma once  

#include <stdio.h>  

void hello(void);  

#pragma onceというのはこのヘッダーファイルを一回だけインクルードするようにする命令です。
これを書いておくとこのヘッダーファイルが色々なファイルから参照されたとしても一回だけの取り込みになります。

ヘッダーファイルに構造体の定義などを書いておいて色々なファイルからインクルードするようにすると、多重定義エラーなどが起こります。
そうならないようにこの#pragma onceを書いておきます。

そしてhello.hにはhello.cで必要なヘッダーファイルも書いておきます。
hello.cではprintf()を使っているのでstdio.hも必要です。
ですので#include <stdio.h>を書いておきます。

そしてさらにhello()関数のプロトタイプ宣言もhello.hに書いておきます。

void hello(void);  

このプロトタイプ宣言を書いておくことでhello.hをインクルードすると自然にhello()関数のプロトタイプ宣言が行われます。
hello()関数を使いたいファイルはこのhello.hをインクルードすれば良いということになります。

関連記事
C言語の関数のプロトタイプ宣言の書き方
C言語の関数の作り方とは?処理をわけてプログラムをスッキリさせる

helloモジュールを使う

ではhelloモジュールを使ってみましょう。
main.cを↓のように定義します。

#include "hello.h"  

int main(void) {  
    hello();  // Hello!  
    return 0;  
}  

↑のようにmain関数からhello関数を呼び出すと画面に「Hello!」と出力されます。

コンパイルを行う

hello.cmain.cを作成しました。
あとはこれらのファイルをコンパイルすればプログラムができます。

コンパイル方法はGCCでは↓のように行います。

$ gcc main.c hello.c  

コンパイルを実行すると現在のディレクトリ以下にa.outa.exeができます。
あとはこれを実行すればいいわけです。

$ ./a.out  
Hello!  

↑のようにhello関数が実行されて「Hello!」と出力されます。

関数の追加

hello()以外に新しい関数を追加する場合はhello.cに定義を書き、hello.hにプロトタイプ宣言を書きます。
この時このhello.chello.hをセットでhelloモジュールと言うことができます。

hello.cに書かれている関数はhelloモジュールに所属する関数です。

C言語では1組のソースファイルとヘッダーファイルをモジュールとして扱うことが多いです。
もちろん1つのソースファイルに2つのヘッダーファイルを含めるなど、いろいろバリエーションは存在します。
ですが基本的には1組を1セットとして扱う傾向が多いです。

おわりに

今回は関数をグローバルに使う方法を解説しました。
関数を使いまわすと開発がはかどります。
覚えておきたいテクニックですね。

🦝 < C言語のグローバル化

🐭 < 関数を自在に扱おう