Menu
Coddy logo textTech

static関数

CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 4/61。

コードを複数のファイルに分割すると、ソースファイル内で定義されたすべてのfunctionは、デフォルトでother filesから参照できます。しかし、ときには内部でのみ使用すべきhelper functionsが必要になります。つまり、other filesがアクセスしたり、存在を知ったりするべきではないfunctionです。

staticキーワードをfunctionに適用すると、its可視性は定義されているfileに制限されます。これにより、誰かが宣言しようとしても、他のソースfilesからcalledできないプライベートfunctionが作成されます。

// math_utils.c
#include "math_utils.h"

// プライベートヘルパー - このファイル内でのみ可視
static int square(int x) {
    return x * x;
}

// パブリック関数 - main.cから呼び出せる
int sum_of_squares(int a, int b) {
    return square(a) + square(b);
}

この例では、sum_of_squares はヘッダーで宣言されているため、どこからでも使用できます。一方、square には static が付けられているため、math_utils.c 内にのみ存在します。main.csquare() を直接 Call しようとすると、リンカーはエラーを生成します。その function は自身の file の外には単に存在しないためです。

これは、ファイルレベルでカプセル化を実現する C の方法です。static 関数を使うと、実装の詳細を隠しながら、内部で必要な任意の helper ロジックを使用し、公開インターフェースをすっきり保てます。

challenge icon

チャレンジ

簡単

数値の二乗を計算する Private helper function を使用した距離計算機を作成しましょう。この詳細は、プログラムの他の部分から隠しておく必要があります。

次の3つのファイルを Create します。

  • distance.h:単一の Public function distance_squared を Declare するヘッダーファイルです。この function は、2つの点を表す four integers(x1、y1、x2、y2)を takes、integer を returns します。DISTANCE_H という symbol を using した Include guards も含めます。
  • distance.c:Implement を含むソースファイルです。integer を takes、その square を returns する static helper function square を Create します。この helper は distance.c within で only visible である必要があります。次に、static helper を using して、(x2-x1)² + (y2-y1)² を calculate する distance_squared を Implement します。
  • main.c:ヘッダーを include し、Public function を使用する main ファイルです。square helper はここからアクセスできないようにします。利用できるのは distance_squared only です。

distance_squared function は、2つの点のユークリッド距離の二乗を calculate します。square function を static に保つことで、この実装の詳細を distance.c の外部にある code から隠しています。

4つの integer inputs、x1y1x2y2 を受け取ります。

距離の二乗を次の format で print します。

Squared distance: {result}

たとえば、点 (0, 0) と (3, 4) の場合、output は次のようになります。

Squared distance: 25

自分で試してみよう

#include <stdio.h>
#include "distance.h"

int main() {
    int x1, y1, x2, y2;
    scanf("%d", &x1);
    scanf("%d", &y1);
    scanf("%d", &x2);
    scanf("%d", &y2);
    
    // TODO: 入力座標を使って distance_squared を呼び出す
    // and print the result in the format: "Squared distance: {result}"
    
    return 0;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Cオンラインコンパイラ