C言語関係掲示板

過去ログ

No.1247 分割コンパイル での static の扱いについて

[戻る] [ホームページ]
No.2493

分割コンパイル での static の扱いについて
投稿者---hex(2004/08/17 22:48:32)


分割コンパイルについての質問です。
オリジナルのヘッダファイル head.h の中で、関数を以下のように宣言したとします、

static int my_func(int head);

そして head.c ファイルの中で my_func 関数の実態を定義したとします。my_func 関数の中ではいくつかの static 変数を宣言し使ったとします。この場合、上記のように head.h 関数の中での my_func 関数のプロトタイプは extern ではなく static な関数としておかないと、my_func 関数の中で static な変数を使っているので、分割コンパイルなのでもし他のファイルから my_func 関数を呼び出しているのがあると static 変数の値が意図したものとは異なったものになってしまいますよね?
たぶん考え方はあってると思うのですが、今後のこともあるので確認したくて質問させてもらいました。助言を宜しくお願いします。


No.2494

Re:分割コンパイル での static の扱いについて
投稿者---シャノン(2004/08/17 23:12:00)


>分割コンパイルについての質問です。
>オリジナルのヘッダファイル head.h の中で、関数を以下のように宣言したとします、
>
>static int my_func(int head);
>
>そして head.c ファイルの中で my_func 関数の実態を定義したとします。my_func 関数の中ではいくつかの static 変数を宣言し使ったとします。この場合、上記のように head.h 関数の中での my_func 関数のプロトタイプは extern ではなく static な関数としておかないと、my_func 関数の中で static な変数を使っているので、分割コンパイルなのでもし他のファイルから my_func 関数を呼び出しているのがあると static 変数の値が意図したものとは異なったものになってしまいますよね?
>たぶん考え方はあってると思うのですが、今後のこともあるので確認したくて質問させてもらいました。助言を宜しくお願いします。

関数の static 宣言とは、それが宣言されているソースファイルの外からは呼べないという制限です。
ヘッダファイルで static 宣言をすることは、それを include するすべてのソースファイルで個別に static 宣言をするのと同じことです。
static 関数はソースファイルごとにローカルなものなので、あるファイルで定義された static 関数と、他のファイルで定義された同名の static 関数があったとしても、その実体は違うものになります。
よって、その中で宣言されたローカル変数の実体もまた、ファイルごとに固有のものとなります。


No.2495

Re:分割コンパイル での static の扱いについて
投稿者---hex(2004/08/17 23:30:06)


>よって、その中で宣言されたローカル変数の実体もまた、ファイルごとに固有のものとなります。

さっそくの返信ありがとうございました。
考え方はあっていたみたいですね。説明して下さったのを読んで、より理解が深まりました。どうもありがとうございました。


No.2497

Re:分割コンパイル での static の扱いについて
投稿者---かずま(2004/08/17 23:57:16)


> オリジナルのヘッダファイル head.h の中で、関数を以下のように宣言したとします、
>
> static int my_func(int head);
>
> そして head.c ファイルの中で my_func 関数の実態を定義したとします。
> my_func 関数の中ではいくつかの static 変数を宣言し使ったとします。
> この場合、上記のように head.h 関数の中での my_func 関数のプロトタイプは
> extern ではなく static な関数としておかないと、my_func 関数の中で
> static な変数を使っているので、分割コンパイルなのでもし他のファイルから
> my_func 関数を呼び出しているのがあると static 変数の値が意図したものとは
> 異なったものになってしまいますよね?
・my_func が static 宣言されていると、他のファイルから呼び出すことはできない。
・関数の static 宣言と、関数内の局所変数の static 宣言とは無関係。 
 
head.c の中に、他のファイルから呼び出して欲しくない関数 my_func と
他のファイルから呼び出して欲しい関数 my_func2 の定義があったとすると、
次のように書くべきです。

--- head.h ---
#ifndef HEAD_H
#define HEAD_H

int my_func2(int head);

#endif
--- end of head.h ---

--- head.c ---
#include "head.h"

static int my_func(int head);

int my_func(int head) { ... }
int my_func2(int head) { ... }
--- end of head.c ---


--- file.c ---
#include "head.h"

void func(void) { int n = my_func2(0); }
--- end of file.c ---



No.2498

Re:分割コンパイル での static の扱いについて
投稿者---hex(2004/08/18 01:14:30)


かずまさん返信ありがとうございます。
サンプルまで提示していただいて大変分かりやすかったです。
どうもありがとうございました。