1

次の宣言は正しいですか?

機能外:

int a; //external by default
extern int a; //explicitly extern
static int a; //explicity static
const int a; //static by default
static const int a; //explicitly static
extern const int a; //explicitly extern

関数内:

int a; //auto by default
static in a; //explicity static
const int a; //static by default
static const int a; //explicitly static
4

3 に答える 3

2

選ぶ。

グローバルスコープ(つまり、関数の外部)にあるものはすべて、デフォルトで静的です。

例えば:

//main.c
int myVar;  // global, and static

int main(void) {
  ...
  return 0;
}

//morecode.c
extern int myVar; //other C files can see and use this global/static variable

ただし、グローバルスコープで何かを静的として明示的に宣言すると、静的であるだけでなく、そのファイル内でのみ表示されます。他のファイルはそれを見ることができません。

//main.c
static int myVar;  // global, and static

int main(void) {
  ...
  return 0;
}

//morecode.c
extern int myVar; // compiler error; "myVar" can only be seen by 
                  // code in main.c since it was explicitly 
                  // declared static at the global scope

また、デフォルトでは「外部」はありません。上記の例のように静的に明示的に宣言されていない場合は、通常、externを使用して他のファイルからグローバル変数にアクセスします。

constは、スコープに関係なく、データを変更できないことを意味するだけです。これは、外部または静的を意味するものではありません。何かが「externconst」または「extern」である可能性がありますが、「externstatic」は実際には意味がありません。

最後の例として、このコードはほとんどのコンパイラでビルドされますが、問題があります。myVarは、技術的に作成するファイルであっても、常に「extern」と宣言されます。悪い習慣:

//main.c
extern int myVar;  // global, and static, but redundant, and might not work
                   // on some compilers; don't do this; at least one .C file
                   // should contain the line "int myVar" if you want it 
                   // accessible by other files
int main(void) {
  ...
  return 0;
}

//morecode.c
extern int myVar; //other C files can see and use this global/static variable

最後に、まだ慣れていない場合は、さまざまなレベルのスコープについてこの投稿を取り上げることをお勧めします。それはおそらくあなたにとって有益で有益なものになるでしょう。幸運を!

用語の定義-Cアプリケーションのスコープ

私の意見では、この私の質問にスコープで答えた人は良い仕事をしました。

また、関数内で静的なものを宣言した場合、値は関数呼び出しの間に残ります。

例えば:

int myFunc(int input) {
  static int statInt = 5;
  printf("Input:%d  statInt:%d",input,statInt);
  statInt++;
  return statInt;
}

int main(void) {
  myFunc(1);
  myFunc(5);
  myFunc(100);
  return 0;
}

出力:

Input:1  statInt:0
Input:5  statInt:1
Input:100  statInt:2

関数内での静的変数の使用には、それらが役立つ特定の限られた数のケースがあり、通常、ほとんどのプロジェクトにとっては良い考えではないことに注意してください。

于 2012-05-04T19:57:16.020 に答える
1

externあなたが持っている1つの誤解は、の反対であるように見えますstatic。これはそうではありません。あなたはこれを持っています:

int a; //extern by default

これは「デフォルトで外部」ではありません。extern宣言は、実際の変数定義が他の場所にあることを意味します。したがって、ソースファイルにこれがある場合:

extern int a;

次に、別の場所に次のソースファイルがあります。

int a;

それ以外の場合は、コードをコンパイルすると次のようになります。

/tmp/cc3NMJxZ.o: In function `main':
foo.c:(.text+0x11): undefined reference to `a'
collect2: ld returned 1 exit status

static関数定義の外側は、変数が同じファイルで定義された他のコードにのみ表示されることを意味します。がないstaticということは、オブジェクトファイルにリンクする可能性のあるコードに対して変数がグローバルに表示されることを意味します。

確信はありませんが、それがconst意味するとは思いませんstatic。テストするのはそれほど難しいことではありません。

...そして確かに、非常に単純なテストはそれconstが意味しないことを確認しstaticます。

于 2012-05-04T19:46:33.247 に答える
1

保存期間とリンクの概念を分離する必要があります。externそしてstatic、さまざまな状況で、これらのプロパティと他の効果の両方に影響を与える可能性がありますが、それらのいずれかの唯一の決定要因ではありません。

ファイルスコープで


int a;

これは暫定的な定義です。a静的ストレージ期間と外部リンケージがあります。


extern int a;

宣言ですが、定義ではありません。静的ストレージ期間と外部リンケージ(または、表示されている場合は事前の宣言によって決定されたリンケージ)。


static int a;

暫定的な定義。静的ストレージ期間と内部リンケージ。


const int a;

暫定宣言。静的ストレージ期間と外部リンケージ(C ++とは異なります)。


static const int a;

暫定的な定義。静的ストレージ期間と内部リンケージ。


extern const int a;

定義ではなく宣言。静的ストレージ期間と外部リンケージ(または、表示されている場合は事前の宣言によって決定されたリンケージ)。


ブロックスコープ内


int a;

意味。自動保存期間とリンクなし。


static int a;

意味。静的ストレージ期間とリンクなし。


const int a;

意味。自動保存期間とリンクなし。(これは厳密に合法だと思いaますが、未定義の動作を引き起こさずにの不確定な初期値を変更することはできないため、あまり役に立ちません。)


static const int a;

意味。静的ストレージ期間とリンクなし。(繰り返しますが、あまり役に立ちません!)

于 2012-05-04T20:23:32.617 に答える