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.c が square() を直接 Call しようとすると、リンカーはエラーを生成します。その function は自身の file の外には単に存在しないためです。
これは、ファイルレベルでカプセル化を実現する C の方法です。static 関数を使うと、実装の詳細を隠しながら、内部で必要な任意の helper ロジックを使用し、公開インターフェースをすっきり保てます。
チャレンジ
簡単数値の二乗を計算する Private helper function を使用した距離計算機を作成しましょう。この詳細は、プログラムの他の部分から隠しておく必要があります。
次の3つのファイルを Create します。
distance.h:単一の Public functiondistance_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 するstatichelper functionsquareを Create します。この helper はdistance.cwithin で only visible である必要があります。次に、static helper を using して、(x2-x1)² + (y2-y1)² を calculate するdistance_squaredを Implement します。main.c:ヘッダーを include し、Public function を使用する main ファイルです。squarehelper はここからアクセスできないようにします。利用できるのはdistance_squaredonly です。
distance_squared function は、2つの点のユークリッド距離の二乗を calculate します。square function を static に保つことで、この実装の詳細を distance.c の外部にある code から隠しています。
4つの integer inputs、x1、y1、x2、y2 を受け取ります。
距離の二乗を次の 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;
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ