2016-07-25 7 views
1

2つの異なるファイルに2つの静的変数(同じ名前を持つ)を定義したとしましょう。これらはbssセクションに格納されます。2つの初期化されていない静的変数間の差異

//File1.c 
static int st; 

//File2.c 
static int st; 

しかし、どのファイルが実行時にどのファイルに属するかは、どのように区別されますか。

私はここで話題のカップルが見つかりましたが、私の質問に答えるではない -

  1. Two static variables in same name(two different file) and extern one of them in any other file

  2. Where are static variables stored (in C/C++)?

+3

を 'しかし、どのように差別化は、そのどちらが実行time.'でどのファイル..それはコンパイラの機能です属するそれらの間で行われますリンカー。投稿した2番目のリンクから[この回答](http://stackoverflow.com/questions/93039/where-are-static-variables-stored-in-c-c/109120#109120)を読んで、範囲について話します。 – txtechhelp

+0

すばらしい..説得力のある... – sas

答えて

2

実行時の名前のための必要はありませんが。名前はあなたとCコンパイラにのみ必要です。 Cコンパイラは、それが属するファイル、定義されているファイルを認識します。十分な情報です。

両方の変数は、.bssセクションにそれぞれの名前で格納されていますが、異なるメモリ位置に格納されています。それが彼らの区別です。

あなたは彼らがobjdumpを使用して保存されているかを自分で確認することができます。

$ cat foo1.c 
static int foo = 1; 

$ cat foo2.c 
static int foo = 2; 

$ cat main.c 
int main(void) { return 0; } 

$ gcc -g -O0 -o foo foo1.c foo2.c main.c 

$ objdump -d -j .data foo 
test:  file format elf64-x86-64 


Disassembly of section .data: 

00000000006008a8 <foo>: 
    6008a8: 01 00 00 00           .... 

00000000006008ac <foo>: 
    6008ac: 02 00 00 00           .... 
+0

ありがとうございます。 – sas

関連する問題