2009-08-17 15 views

答えて

10

は、それらを使用することができるときについてあなたの質問に答えるために、簡単な例をいくつ:

静的ポインタがそれを最初に割り当て、常にプログラムに同じバッファを返す関数を実装するために使用することができ

それが呼び出されます。

char * GetBuffer() { 
    static char * buff = 0; 
    if (buff == 0) { 
     buff = malloc(BUFSIZE); 
    } 
    return buff; 
} 

にextern(つまりグローバル)ポインタがメインのパラメータにアクセスするには、他のコンパイル単位を可能にするために使用することができます

extern int ArgC = 0; 
extern char ** ArgV = 0; 

int main(int argc, char ** argv) { 
    ArgC = argc; 
    ArgV = argv; 
    ... 
} 
+0

なぜbuffがcharですか? intではありませんでしたか? – tetris

+2

これは例なのでcharです。それはint、double、yada yadaかもしれない。 –

2

は基本的にHow to correctly use the extern keyword in C

そしてInternal static variables in C, would you use them?

を参照してください。存在する場合(標準Cで)、「静的」機能で使用された場合、それは通常、一度機能の終了と同じように、変数が一掃されていないことができます(つまり、関数が呼び出されるたびに古い値が保持されます)。 "Extern"は、変数のスコープを拡大して他のファイルで使用できるようにします(つまり、グローバル変数にします)。

2

短答。 スタティックは永続的なので、関数で宣言すると、関数を再度呼び出すと、前回と同じ値になります。グローバルに宣言すると、そのファイル内ではグローバルのみになります。

Externは、グローバルに宣言されていますが、別のファイルに宣言されています。 (これは基本的にこの変数が存在することを意味し、これはその変数が定義するものです)。

7

短い答え:それらは存在しません。 C99 6.7.1では、「宣言の宣言指定子には、せいぜい1つのストレージクラス指定子を与えることができます」と記載されています。 externstaticはどちらもストレージクラス指定子です。

+3

それは疑問の驚くべき解釈に答えています。私は質問が意味することを期待する:静的ポインタの使用は何ですか、そしてexternポインタの使用は何ですか(私は両方が存在することを知っているので、私はその資格を無視します)。 –

2

複数の翻訳単位でグローバルに使用できるようにするポインタがあるとします。私はを1箇所(foo.c)で定義したいが、他の翻訳単位では複数の宣言を許可する。 "extern"キーワードは、これがオブジェクトのを定義するではないことをコンパイラに知らせます。実際の定義は他の場所に表示されます。これは、オブジェクト名をリンカーが利用できるようにするだけです。コードがコンパイルされてリンクされると、異なる翻訳単位はすべて、その名前で同じオブジェクトを参照します。

私は、1つのソースファイル内の関数でグローバルに使用できるようにしたいが、他の翻訳単位では見えないようにするポインタもあるとします。私は "静的"キーワードを使用して、オブジェクトの名前がリンカーにエクスポートされないことを示すことができます。

私は1つの関数内でのみ使用したいポインタを持っていますが、そのポインタの値は関数呼び出しの間に保存されているとします。 "static"キーワードを使用して、オブジェクトに静的エクステントがあることを示すことができます。そのメモリはプログラムの起動時に割り当てられ、プログラムが終了するまで解放されないので、オブジェクトの値は関数呼び出しの間に保持されます。

/** 
* foo.h 
*/ 
#ifndef FOO_H 
#define FOO_H 

/** 
* Non-defining declaration of aGlobalPointer; makes the name available 
* to other translation units, but does not allocate the pointer object 
* itself. 
*/ 
extern int *aGlobalPointer; 

/** 
* A function that uses all three pointers (extern on a function 
* declaration serves roughly the same purpose as on a variable declaration) 
*/ 
extern void demoPointers(void); 
... 
#endif 

/** 
* foo.c 
*/ 
#include "foo.h" 

/** 
* Defining declaration for aGlobalPointer. Since the declaration 
* appears at file scope (outside of any function) it will have static 
* extent (memory for it will be allocated at program start and released 
* at program end), and the name will be exported to the linker. 
*/ 
int *aGlobalPointer; 

/** 
* Defining declaration for aLocalPointer. Like aGlobalPointer, it has 
* static extent, but the presence of the "static" keyword prevents 
* the name from being exported to the linker. 
*/ 
static int *aLocalPointer; 

void demoPointers(void) 
{ 
    /** 
    * The static keyword indicates that aReallyLocalPointer has static extent, 
    * so the memory for it will not be released when the function exits, 
    * even though it is not accessible outside of this function definition 
    * (at least not by name) 
    */ 
    static int *aReallyLocalPointer; 
} 
関連する問題