問題タブ [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.
c++ - 宣言のどこにストレージ クラス指定子を配置できますか?
たとえば、static
ストレージ クラス指定子について考えてみましょう。このストレージ クラス指定子の有効な使用法と不適切な使用法の例を次に示します。
(「有効」とマークされた宣言は、Visual C++ 2012、g++ 4.7.2、および Clang++ 3.1 で受け入れられました。「形式が正しくない」とマークされた宣言は、これらすべてのコンパイラによって拒否されました。)
ストレージ クラス指定子が宣言された変数に適用されるため、これは奇妙に思えます。宣言された変数static
の型ではなく、宣言された変数です。なぜe
とは整形式i
でないのにk
整形式なのですか?
ストレージ クラス指定子の有効な配置を管理するルールは何ですか? この例では使用static
しましたが、問題はすべてのストレージ クラス指定子に適用されます。できれば、完全な回答では、C++11 言語標準の関連セクションを引用して説明する必要があります。
c - 宣言指定子と宣言子
宣言のどこにストレージクラス指定子を配置できるかという質問を参照してください。declaration-specifiers
との概念の分析を開始しましたdeclarators
。以下は私の理解の蓄積です。
宣言
- 一般に、
C
宣言は次の構文に従います。declaration-specifiers declarators;
declaration-specifiers
で構成されtype-specifiers
、storage-class-specifiers
type-qualifiers
declarators
変数、ポインター、関数、配列などにすることができます。
私が想定するルール
declaration-specifiers
例として、任意の順序で指定できます- 1つ以上存在することはできません
storage-class-specifier
- 一方、複数存在する可能性があります
type-qualifiers
storage-class-specifier
と一緒に行くことはありませんdeclarator
質問
declarator
Q1:定数ポインターの宣言で、以下のようにとの組み合わせが見type-qualifier
られます
Q2:へのポインタが存在する可能性がありますstatic int
。ポインタにstatic
ストレージクラスを提供する可能性はありますか?ポインタが静的であることを意味します。
c - ストレージの場所に対する型修飾子の影響
タイトルにもありますが、宣言子type-qualifiers
の格納場所( など)が影響するのstack
か少し戸惑っています。bss
- 上記のコードでは、デフォルト
storage-class-specifier
はauto
です。 - したがって、これらの定数は、作成時に
stack-frame
ofに割り当てられると想定main
されます。 - 一般に、
pointers
スタック内のさまざまなメモリ位置には、そこに含まれる値を自由に変更できます。 - したがって、上記の点から、格納された要素の性質
type-qualifier
を保持するためにいくつかのロジックを追加するか(そうであれば、それは何ですか?) 、メモリに格納されることは理解できます。これについて詳しく説明してください。constant
constants
read-only-portion
より詳細な例
上記の例では、 と の両方が同じ場所cptr
をptr
指しています。しかし、整数cptr
へのポインタです。const type qualified
の値を変更しているcptr
ときに、コンパイラは「読み取り専用の場所 '*cptr' の割り当て」としてエラーをスローします。しかし、以下の出力のように、同じ場所をで変更できます。説明してくださいptr
c - constデータへのグローバルconstポインターは、c / c ++のgccコンパイラーによって個別の読み取り専用セクションに配置されることが保証されていますか?
グローバル(または静的ローカル)変数の次の定義が与えられます:
、初期化子リストのptrとデータの両方が生成されたオブジェクトファイルの個別の読み取り専用セクションに配置されるという事実に依存できますか(つまり、.dataまたは非const変数を含む同様のセクションには配置されません)?
質問は、すべてのアーキテクチャ/プラットフォーム(少なくとも読み取り専用メモリが存在するもの)に共通するgcc c /c++コンパイラの動作にのみ関連しています。プラットフォーム、プロセッサ、OS、リンカー、起動ランタイム、ライブラリなどを意味するものではありません。
どうか、私が何をしようとしているのか聞かないでください。私は自分が何をしているのか知っています。私が提供した情報が答えに十分でない場合、問題はxxx固有のものと見なされる必要があり、一般的な答えは「いいえ」です。私はすでに質問を読みました-この主題が非常に近くに言及された答え:
型修飾子が格納場所に与える影響
読み取り専用メモリはCでどのように実装されていますか?
「const」は単に読み取り専用またはそれ以上の意味ですか?
コンパイラでconst変数をここに「書き込む」ことができるのはなぜですか?
GCC C ++(ARM)および構造体フィールド
memcpyへのconstポインターと、constデータへの宛先ポインター
しかし、私は確実で直接的な答えを見つけられませんでした。
c - 「ファイルスコープ」と「プログラムスコープ」の違いは何ですか
グローバルに宣言された変数はプログラムスコープ
を持っていると言われますstaticキーワードでグローバルに宣言された変数はファイルスコープを持っていると言われます。
例えば:
これら2つの違いは何ですか?
c - Cの_Thread_localストレージクラス指定子?
私は本CHowto Program 7thで、次の名前の新しい標準Cストレージクラスに関するメモを読みました_Thread_local
。
新しいC標準では、ストレージクラス指定子が追加されています
_Thread_local
が、これはこの本の範囲を超えています。
Googleで探しましたが、ここには何も表示されません。誰かが私にそれについてのリンクを教えてもらえますか?
c++ - 変数を静的と外部の両方で宣言できますか?
なぜ以下がコンパイルされないのですか?
ただし、順序を逆にすると、正常にコンパイルされます。
ここで何が起こっているのですか?
c - 同じコストでグローバル変数を取得できる場合、静的ローカル変数の使用は何ですか?
Cでは、外部変数が同じコストでその目的を果たすことができる場合の静的ストレージクラスの使用は何ですか. どちらも、実行可能ファイルのデータ セグメント内のストレージ スペースを占有します。
外部変数のスコープがはるかに優れています。外部変数のスコープを特定のファイルにしたい場合は、この変数を他の場所で宣言しません。静的なローカル変数であるグローバル変数には多くの柔軟性があります
また、変数のアドレスがあれば、関数外のローカル静的変数を参照できます。ローカル静的変数のメモリは、関数のスタック フレームではなく、データ セグメントにあります。そのため、独自の機能により、静的ストレージ クラスがテーブルにもたらされます。 .
static に気づいていない微妙な目的があるかどうかを知りたいだけです。
c - 「extern」がなくても、File1 で定義された配列の使用が File2 (そこでのみ宣言されている) で機能するのはなぜですか?
ここには 2 つのファイルがexterndemo1.c
ありexterndemo2.c
、最初のファイルでは、arr
ファイル スコープで文字配列をexterndemo2.c
宣言して初期化しextern
ましたdisplay()
。そこから生じる私の混乱は次のとおりです。次の 3 つに答えてください。
1)キーワード inarr
なしで宣言したにもかかわらず、プログラムが正常にコンパイルされるのはなぜですか? 関数のデフォルトのリンケージが外部であることを読んだことがありますが、変数についてもそうであるかどうかはわかりません。グローバル変数にはストレージがあることしかわかりません。クラス。extern
externdemo2.c
extern
2)extern storage class
との厳密な違いは何ですか。これextern linkage
について明確にする必要があります。配列を定義した最初のファイルではarr
、キーワードを使用していませんが、デフォルトでクラスextern
があることはわかっています。 2 番目のファイル、つまり、グローバル変数に関するextern storage
デフォルトのストレージ クラスまたはリンケージはありませんか?extern
arr
externdemo2.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
c - 複数のファイルでのExternと二重定義の可能性
次のようにまとめてコンパイルされた次のコードを実行していました。gcc A.c B.c -o combined
プログラム A:
プログラム B:
「結合された」プログラムを実行すると、出力は次のようになりました。
さて、私はこれについていくつかの疑問を持っています:
出力がないのはなぜですか:
0 2
1 0
a と b が 2 回定義されていませんか?
これらを明確に説明してください。私は extern を理解するのに多くの問題を抱えており、これらの疑問のいくつかは時々出てきます。
前もって感謝します。