2016-08-15 12 views
-4

私は、staticの関数は自分のファイル内でしかアクセスできないが、それらの外部ではアクセスできないと読んでいます。Cの静的関数は他のファイルからもアクセスできます

#include <stdio.h> 

static void staticFunc(void) 
{ 
    puts("Static function called"); 
} 


void nonStaticFunc(void) 
{ 
    puts("Non-Static function called "); 
} 

、その後は次のように別のファイルfile_2.cにインポートし、それらの両方を呼び出す

file_a.c、その上に私が代わりに戻って両方の文字列を取得:私は、ファイルfile_a.cに二つの機能を定義しましたエラーの:

file_b.c

#include "file_a.c" 

int main(int argc, char *argv[]) 
{ 

    staticFunc(); 
    nonStaticFunc(); 

    return 0; 
} 

プリント:

Static function called 
Non-Static function called 

どうしてですか?

+2

スタティック関数は、同じコンパイル単位でのみ使用できます。あなたがファイルを 'インクルード 'するので、それは同じユニットの一部になります。 –

+1

'#include'ディレクティブの詳細を読むことをお勧めします。このディレクティブは、なぜあなたが提供した結果を得ているのかを理解するのに役立ちます。 –

+0

'-E'でコンパイルして、プリプロセッサの出力を見ることもできます。プリプロセッサの出力は、コンパイラが入力とみなすものです。 – user3386109

答えて

9

このシナリオは、インクルードディレクティブ#include "file_a.c"によって発生します。あなたは文字通り他のファイルfile_b.cfile_a.cを追加しています。これにより、他の翻訳単位でstaticFunc()が利用可能になります。

しないでください。ソースファイル(*.c)は用ではありません。;ヘッダファイル(これには宣言が含まれていますが、の定義はではありません)があります。ソースファイルは、互いに別々にコンパイルされ、バイナリを生成するためにリンクされています。

詳細を理解するために、前処理されたコードを見てください。

+0

"問題"があるとは必ずしも言えませんが、コンパイラは何をするように指示されたのかを正確に実行しています。 –

+0

@BryndenBielefeld十分に公正で、更新されました。 –

+0

ある時点で、メインライブラリとSQLiteとともに配布されているパーサージェネレータの両方のために、SQLiteが使用する '合併'を調べます。それにもかかわらず、あなたの主なポイントは有効です - 別のソースファイルにソースファイルを含めることを保証するためには例外的な状況が必要です。 (例外的な状況については、「静的関数のテスト方法」(http://stackoverflow.com/questions/593414/)を参照してください)。 –

関連する問題