[解決済み] C言語における「static」の意味とは?
質問
という言葉を目にしたことがあります。
static
Cコードのさまざまな場所で使用されています。これは、C#の静的関数/クラス(オブジェクト間で実装が共有される)のようなものでしょうか?
どのように解決するのですか?
- 関数内の静的変数は、呼び出しの間、その値を保持します。
- 静的グローバル変数または関数は、宣言されたファイルの中でのみ見ることができます。
(1)は、初心者の方にとってはより外国的な話題ですので、ここで例を挙げてみましょう。
#include <stdio.h>
void foo()
{
int a = 10;
static int sa = 10;
a += 5;
sa += 5;
printf("a = %d, sa = %d\n", a, sa);
}
int main()
{
int i;
for (i = 0; i < 10; ++i)
foo();
}
これが印刷されます。
a = 15, sa = 15
a = 15, sa = 20
a = 15, sa = 25
a = 15, sa = 30
a = 15, sa = 35
a = 15, sa = 40
a = 15, sa = 45
a = 15, sa = 50
a = 15, sa = 55
a = 15, sa = 60
これは、ある関数が起動するまでの間に何らかの状態を保持する必要があり、かつグローバル変数を使いたくない場合に有効です。しかし、この機能はあまり使わないでください。スレッドセーフでなくなり、理解しにくいコードになってしまいます。
(2)アクセスコントロール機能として広く使われている。ある機能を実装した .c ファイルがあったとして、それは通常いくつかの "public" 関数だけをユーザーに公開します。残りの関数は
static
のように、ユーザーがアクセスできないようにします。これがカプセル化であり、良い習慣である。
引用元 ウィキペディア :
プログラミング言語Cでは、static は、グローバル変数と 関数は、そのスコープを を含むファイルです。ローカル変数では staticは、変数 を静的に割り当てたメモリ 自動的に割り当てられるのではなく メモリに保存されます。言語では どちらの実装も タイプのメモリがありますが、静的に割り当てられた メモリは通常、データ セグメントを作成します。 一方、自動 通常、割り当てられたメモリは は、トランジェント・コールスタックとして実装されています。
そして2つ目の質問に答えると、C#のようにはいきません。
ただし、C++の場合。
static
は、クラス属性(同じクラスのすべてのオブジェクトで共有される)やメソッドを定義するためにも使用されます。C言語ではクラスが存在しないので、この機能は関係ありません。
関連
-
C++の配列コピー
-
[解決済み] C言語で%sを正しく使う - 超基本レベル
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] Pythonの関数内の静的変数に相当するものは何ですか?
-
[解決済み] 静的変数が悪とされるのはなぜですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] C 言語で const char* を char* に変換するには?
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?