問題タブ [storage-class-specifier]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
3977 参照

c++ - 宣言のどこにストレージ クラス指定子を配置できますか?

たとえば、staticストレージ クラス指定子について考えてみましょう。このストレージ クラス指定子の有効な使用法と不適切な使用法の例を次に示します。

(「有効」とマークされた宣言は、Visual C++ 2012、g++ 4.7.2、および Clang++ 3.1 で受け入れられました。「形式が正しくない」とマークされた宣言は、これらすべてのコンパイラによって拒否されました。)

ストレージ クラス指定子が宣言された変数に適用されるため、これは奇妙に思えます。宣言された変数staticの型ではなく、宣言された変数です。なぜeとは整形式iでないのにk整形式なのですか?

ストレージ クラス指定子の有効な配置を管理するルールは何ですか? この例では使用staticしましたが、問題はすべてのストレージ クラス指定子に適用されます。できれば、完全な回答では、C++11 言語標準の関連セクションを引用して説明する必要があります。

0 投票する
3 に答える
12028 参照

c - 宣言指定子と宣言子

宣言のどこにストレージクラス指定子を配置できるかという質問を参照してください。declaration-specifiersとの概念の分析を開始しましたdeclarators。以下は私の理解の蓄積です。

宣言

  • 一般に、C宣言は次の構文に従います。declaration-specifiers declarators;
  • declaration-specifiersで構成されtype-specifiersstorage-class-specifierstype-qualifiers
  • declarators変数、ポインター、関数、配列などにすることができます。

私が想定するルール

  • declaration-specifiers例として、任意の順序で指定できます
  • 1つ以上存在することはできませんstorage-class-specifier
  • 一方、複数存在する可能性がありますtype-qualifiers
  • storage-class-specifierと一緒に行くことはありませんdeclarator

質問

declaratorQ1:定数ポインターの宣言で、以下のようにとの組み合わせが見type-qualifierられます

Q2:へのポインタが存在する可能性がありますstatic int。ポインタにstaticストレージクラスを提供する可能性はありますか?ポインタが静的であることを意味します。

0 投票する
2 に答える
113 参照

c - ストレージの場所に対する型修飾子の影響

タイトルにもありますが、宣言子type-qualifiersの格納場所( など)が影響するのstackか少し戸惑っています。bss

  • 上記のコードでは、デフォルトstorage-class-specifierautoです。
  • したがって、これらの定数は、作成時にstack-frameofに割り当てられると想定mainされます。
  • 一般に、pointersスタック内のさまざまなメモリ位置には、そこに含まれる値を自由に変更できます。
  • したがって、上記の点から、格納された要素の性質type-qualifierを保持するためにいくつかのロジックを追加するか(そうであれば、それは何ですか?) 、メモリに格納されることは理解できます。これについて詳しく説明してくださいconstantconstantsread-only-portion

より詳細な例

上記の例では、 と の両方が同じ場所cptrptr指しています。しかし、整数cptrへのポインタです。const type qualifiedの値を変更しているcptrときに、コンパイラは「読み取り専用の場所 '*cptr' の割り当て」としてエラーをスローします。しかし、以下の出力のように、同じ場所をで変更できます。説明してくださいptr

0 投票する
1 に答える
623 参照

c - constデータへのグローバルconstポインターは、c / c ++のgccコンパイラーによって個別の読み取り専用セクションに配置されることが保証されていますか?

グローバル(または静的ローカル)変数の次の定義が与えられます:

、初期化子リストのptrデータの両方が生成されたオブジェクトファイルの個別の読み取り専用セクションに配置されるという事実に依存できますか(つまり、.dataまたは非const変数を含む同様のセクションには配置されません)?

質問は、すべてのアーキテクチャ/プラットフォーム(少なくとも読み取り専用メモリが存在するもの)に共通するgcc c /c++コンパイラの動作にのみ関連しています。プラットフォーム、プロセッサ、OS、リンカー、起動ランタイム、ライブラリなどを意味するものではありません。

どうか、私が何をしようとしているのか聞かないでください。私は自分が何をしているのか知っています。私が提供した情報が答えに十分でない場合、問題はxxx固有のものと見なされる必要があり、一般的な答えは「いいえ」です。私はすでに質問を読みました-この主題が非常に近くに言及された答え:

型修飾子が格納場所に与える影響
読み取り専用メモリはCでどのように実装されていますか?
「const」は単に読み取り専用またはそれ以上の意味ですか?
コンパイラでconst変数をここに「書き込む」ことができるのはなぜですか?
GCC C ++(ARM)および構造体フィールド
memcpyへのconstポインターと、constデータへの宛先ポインター

しかし、私は確実で直接的な答えを見つけられませんでした。

0 投票する
4 に答える
24174 参照

c - 「ファイルスコープ」と「プログラムスコープ」の違いは何ですか

グローバルに宣言された変数はプログラムスコープ
を持っていると言われますstaticキーワードでグローバルに宣言された変数はファイルスコープを持っていると言われます。

例えば:

これら2つの違いは何ですか?

0 投票する
1 に答える
3455 参照

c - Cの_Thread_localストレージクラス指定子?

私は本CHowto Program 7thで、次の名前の新しい標準Cストレージクラスに関するメモを読みました_Thread_local

新しいC標準では、ストレージクラス指定子が追加されています_Thread_localが、これはこの本の範囲を超えています。

Googleで探しましたが、ここには何も表示されません。誰かが私にそれについてのリンクを教えてもらえますか?

0 投票する
4 に答える
9604 参照

c++ - 変数を静的と外部の両方で宣言できますか?

なぜ以下がコンパイルされないのですか?

ただし、順序を逆にすると、正常にコンパイルされます。

ここで何が起こっているのですか?

0 投票する
6 に答える
28763 参照

c - 同じコストでグローバル変数を取得できる場合、静的ローカル変数の使用は何ですか?

Cでは、外部変数が同じコストでその目的を果たすことができる場合の静的ストレージクラスの使用は何ですか. どちらも、実行可能ファイルのデータ セグメント内のストレージ スペースを占有します。

外部変数のスコープがはるかに優れています。外部変数のスコープを特定のファイルにしたい場合は、この変数を他の場所で宣言しません。静的なローカル変数であるグローバル変数には多くの柔軟性があります

また、変数のアドレスがあれば、関数外のローカル静的変数を参照できます。ローカル静的変数のメモリは、関数のスタック フレームではなく、データ セグメントにあります。そのため、独自の機能により、静的ストレージ クラスがテーブルにもたらされます。 .

static に気づいていない微妙な目的があるかどうかを知りたいだけです。

0 投票する
3 に答える
198 参照

c - 「extern」がなくても、File1 で定義された配列の使用が File2 (そこでのみ宣言されている) で機能するのはなぜですか?

ここには 2 つのファイルがexterndemo1.cありexterndemo2.c、最初のファイルでは、arrファイル スコープで文字配列をexterndemo2.c宣言して初期化しexternましたdisplay()。そこから生じる私の混乱は次のとおりです。次の 3 つに答えてください。

1)キーワード inarrなしで宣言したにもかかわらず、プログラムが正常にコンパイルされるのはなぜですか? 関数のデフォルトのリンケージが外部であることを読んだことがありますが、変数についてもそうであるかどうかはわかりません。グローバル変数にはストレージがあることしかわかりません。クラス。externexterndemo2.cextern

2)extern storage classとの厳密な違いは何ですか。これextern linkageについて明確にする必要があります。配列を定義した最初のファイルではarr、キーワードを使用していませんが、デフォルトでクラスexternがあることはわかっています。 2 番目のファイル、つまり、グローバル変数に関するextern storageデフォルトのストレージ クラスまたはリンケージはありませんか?externarrexterndemo2.c

3)最初のファイルのコメントアウトされた行を確認しますexterndemo1.c。テストするために、その行を使用しましたextern char arr[3]={'3','4','7'};が、エラーが発生します'arr' initialized and declared 'extern'。このエラーはどういう意味ですか?コメント行についても言及しましたextern int main()が、エラーや警告なしで正常に動作します。ではextern、関数がexternデフォルトであるのに、変数ではなく関数に使用できるのはなぜarrですか?

この件について私を救済するために、少し時間をください.それは、全体についての私の長引く疑問のほとんどをクリアします.3つのビット1)、2)、および3)externすべてに答えることができれば、それは大きな助けになるでしょう.Especially 3) is eating my brains out

0 投票する
4 に答える
4192 参照

c - 複数のファイルでのExternと二重定義の可能性

次のようにまとめてコンパイルされた次のコードを実行していました。gcc A.c B.c -o combined

プログラム A:

プログラム B:

「結合された」プログラムを実行すると、出力は次のようになりました。

さて、私はこれについていくつかの疑問を持っています:

  1. 出力がないのはなぜですか:

    0 2

    1 0

  2. a と b が 2 回定義されていませんか?

これらを明確に説明してください。私は extern を理解するのに多くの問題を抱えており、これらの疑問のいくつかは時々出てきます。

前もって感謝します。