2016-04-06 21 views
3

GNU's getopt_long exampleで、staticはファイルスコープで定義されたフラグに使用されている:静的な目的は何ですか?

static struct option long_options[] 

staticあり、他のようにここに使用される:

/* Flag set by ‘--verbose’. */ 
static int verbose_flag; 

whileループブロックスコープで定義されたlong_options構造体の

ファイルは変数にアクセスできませんか? staticはどちらの場合も同じ方法で使用されていますが、メモリの同じ場所に保存され再初期化されないため、構造体の方が効率的ですか?

答えて

2

ファイルスコープ内の変数にstaticが使用されている場合、そのファイルにローカルであることを意味します。そのキーワードがなければ、externというキーワードの別のファイルでもこの​​キーワードを使用できます。

同じことが関数に適用されます。 Cの関数がファイル内で静的である場合、そのファイルでのみ使用でき、他のファイルでは使用できません。

はい、他のファイルで使用しないようにしています。

+2

これは 'verbose_flag'のみをカバーし、' long_options'は少し違っていることに注意してください。 – hyde

0

C/C++ファイル内のコードブロックから静的が表示される場合、宣言修飾子はこの変数が他のファイルにアクセスできないことを示します。コードブロックに静的が現れると、この変数は静的であると言います。 verbose_flagは前者に適合し、long_optionsは別のものに適合します。

+1

ファイルよりも翻訳単位について話す方が良いでしょう。翻訳単位は基本的にプリプロセッサの後ろに残されているので、すべての.hファイルのすべてのコードもあります。また、.hファイルの 'static'宣言は、.hファイルが含まれているすべての翻訳単位で独立したコピーを作成します。したがって、「他のファイルにアクセスできない」と言うのは間違っています。 – hyde

+1

@hydeあなた自身の答えを書いてみませんか?確かに改善は良いと示唆していますが、コメントは実際には議論そのものを助けるものではありません。 – edmz

+0

@black dkgの答えは今は十分に良いようです。 – hyde

0

私は逆の順序でそれを行います。

static struct option long_options[] 

whileループが実行されますどのように多くの時間を一度、独立して、すべてのために宣言される変数のオプションのために使用されています。

しかし、あなたは(あなたのリンクから抽出された)、全体としてそれを見る必要があります。

... 
while (1) 
{ 
... 
static struct option long_options[] = 
    { 
     /* These options set a flag. */ 
     {"verbose", no_argument,  &verbose_flag, 1}, // <-- IMPORTANT HERE ! 
     {"brief", no_argument,  &verbose_flag, 0}, // <-- IMPORTANT HERE ! 
     /* These options don’t set a flag. 
     We distinguish them by their indices. */ 
     {"add",  no_argument,  0, 'a'}, 
     {"append", no_argument,  0, 'b'}, 
     {"delete", required_argument, 0, 'd'}, 
     {"create", required_argument, 0, 'c'}, 
     {"file", required_argument, 0, 'f'}, 
     {0, 0, 0, 0} 
    }; 
... 
} 
... 

そして、あなたの宣言のリファレンスとして変数が、この場合verbose_flagには、それはそうでなければ、反復回数を超える利用可能であるべきです次の反復で変数を緩めて、もう存在しないものを参照します。これは未定義の動作です。そのため、verbose_flagはファイルに対してグローバルになっています。変数がこのファイルからのみ使用可能であり、別のものからは使用できないことを保証するために静的にされます。

+1

'verbose_flag'はファイルスコープ内にあるので、' static'がなくても反復間で値が失われることはありません。それは別の理由で静的に作られています... – hyde

+0

@hyde私は同じものをコメントしようとしていました – qwr

+0

あなたは正しいです、そして、変数が完全にこのファイルのローカルであることを保証します。他のファイルから使います。 – dkg

関連する問題