4

ヘッダー()ファイルに書き込むC99場合と書き込む場合に違いはありますか?const int x = 1;static const int x = 1;*.h

4

2 に答える 2

3

はい。まず、そのような定義をヘッダーファイルに配置することはお勧めしませんが、配置する場合は、ヘッダーファイルがインクルードされている場所によって異なります。とにかく、static変数を現在のプログラムユニットに対してローカルにします。次に例を示します。

mp1.c:

#include <stdio.h>

void myfunc(void);

const int x = 1;

int main (int argc, char *argv[])
{
    printf ("main: value of x: %d\n",x);
    myfunc();
    return 0;
}

mp2.c:

#include <stdio.h>

extern int x;

void myfunc(void)
{
    printf ("myfunc: value of x: %d\n",x);
}

コンパイル:

gcc -o mp mp1.c mp2.c

正常に動作します。ここで、mp1.cを使用するように変更しstatic const int x = 1;、コンパイルすると(実際にはリンクエラー)、次のようになります。

home/user1> gcc -o mp mp1.c mp2.c
/tmp/ccAeAmzp.o: In function `myfunc':
mp2.c:(.text+0x7): undefined reference to `x'
collect2: ld returned 1 exit status

変数xはmp1.cの外部には表示されません。

static同じことが関数の接頭辞にも当てはまります。

于 2012-06-22T08:33:44.090 に答える
2

cdarkeが言ったように、それは違いを生みます。

const int x = 1;hファイルを含むモジュールごとに、リンカーの表示シンボルのを作成します。
同じシンボルの複数の(表示されている)定義があるため、リンカはエラーで停止する必要があります。

static const int x = 1;hファイルを含むモジュールごとに、変数を作成しますが、リンカーシンボルは作成しません。
リンカはコードをリンクできますが、同じ名前で変数の複数のインスタンスを作成したため、コードが期待どおりに機能するかどうかはわかりません。

ところで。変数をhファイルで定義することは絶対に悪い考えです。標準的な方法は、変数をcファイルで定義し、hファイルで宣言することだけです(本当にアクセスする必要がある場合)。

1つのモジュールで変数を使用staticするだけで、他のすべてのモジュールからは見えないようにする必要がある場合に使用します。
const ...本当に別のモジュールからアクセスする必要がある場合にのみ、IMHOは通常、グローバルにアクセス可能な変数を避ける必要があります。

myFile.c

#include "myFile.h"
const int x=1;
static const int y=2;

myFile.h

extern const int x;
于 2012-06-22T08:49:08.413 に答える