こんにちは。はまじです。

先日、能力の高い後輩がGithubに自作ライブラリ公開してたので、ソースコードリーディングしていました。
そこで気になったのが、関数の定義(実装時)にstatic修飾子をつけていたことです。



static int getNum(void){
  return 5;
}
int main(void){
  printf("%d\n",getNum());
}


これで5が出力されますが、他のファイルからこのファイルをincludeしても、getNum関数を使うことはできません。
static修飾子がついた関数は、他ファイルで参照することを禁止します。
つまり、関数のstatic修飾子は一種の隠蔽化する役割を持っています。

ちなみに、main関数にstatic修飾子つけると怒られます。

#include

static int main(void){
  int i;
  char c;
  printf("%ld\n",sizeof(i));
  printf("%ld\n",sizeof(c));
}

% gcc test.c
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status




ライブラリ等でかなり出てきそうなので,覚えておくといいですね.