私の C プログラミングの本には、静的関数を作成する場合は、 static キーワードを関数定義の前に置く必要があると書かれています。プロトタイプについては何も明示的に言及されていません。また、例ではプロトタイプを使用せず、静的関数をファイルの先頭に配置するだけです (そのため、私が想定しているプロトタイプは必要ありません)。
では、静的関数にはプロトタイプの static キーワードが必要ですか? それとも、定義の前に置くだけですか?
私の C プログラミングの本には、静的関数を作成する場合は、 static キーワードを関数定義の前に置く必要があると書かれています。プロトタイプについては何も明示的に言及されていません。また、例ではプロトタイプを使用せず、静的関数をファイルの先頭に配置するだけです (そのため、私が想定しているプロトタイプは必要ありません)。
では、静的関数にはプロトタイプの static キーワードが必要ですか? それとも、定義の前に置くだけですか?
いいえ。関数宣言 (プロトタイプまたは定義) はstatic
、同じ関数の別の宣言の後に来る場合、キーワードを省略できstatic
ます。
関数の宣言が 1 つある場合static
、その最初の宣言は でなければなりませんstatic
。
ISO/IEC 9899:1999、6.7.1 で定義されています。
[...] 関数のファイル スコープ識別子の宣言に storage-class specifier が含まれている
static
場合、識別子には内部リンケージがあります。[...]
その識別子の前の宣言が可視であるスコープ内で storage-class 指定子を使用
extern
して宣言された識別子の場合、前の宣言が内部リンケージまたは外部リンケージを指定している場合、後の宣言での識別子のリンケージは、指定されたリンケージと同じです。事前宣言時。[...]
関数の識別子の宣言にストレージ クラス指定子がない場合、そのリンケージは、ストレージ クラス指定子で宣言されている場合とまったく同じように決定されます
extern
。[...]
翻訳単位内で、同じ識別子が内部リンケージと外部リンケージの両方で表示される場合、動作は未定義です。
たとえば、これは有効です。
static void foo(void);
void foo(void);
static void foo(void) { }
これも:
static void foo(void) { }
void foo(void);
static void bar(void);
void bar(void) {}
しかし、このコードは正しくありません:
void foo(void);
static void foo(void) { }
通常static
、プロトタイプにも があります (通常は最初に来るため)。
はい、はい、静的を宣言の前に置く必要があります。
これをideone.comに入力してください
int add();
int main(){
printf("%d",add());
return 0;
}
static int add(){
return 1+1;
}
この結果が得られます: http://ideone.com/VzZCiE
これを入力してください
static int add();
int main(){
printf("%d",add());
return 0;
}
static int add(){
return 1+1;
}
あなたはこれを手に入れます:http://ideone.com/sz8HVR
ブーブー