ヘッダー()ファイルに書き込むC99
場合と書き込む場合に違いはありますか?const int x = 1;
static const int x = 1;
*.h
2 に答える
はい。まず、そのような定義をヘッダーファイルに配置することはお勧めしませんが、配置する場合は、ヘッダーファイルがインクルードされている場所によって異なります。とにかく、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
同じことが関数の接頭辞にも当てはまります。
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;