よくみる extern "C" {} と __cplusplus

C向けのライブラリのコードをながめていたらちょくちょく以下のようなコードをみる.

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/* Cのコードがたくさん */

#ifdef __cplusplus
}
#endif /* __cplusplus */

なんだろうと思って調べてみたら.

  • __cplusplus
    • g++でコンパイルされるとdefineされるマクロ
  • extern "C" { /* Cのコード */ }
    • ブレースでかこまれた範囲で,リンカでの識別子の扱い方がCスタイルになる

らしい."この範囲のコードはCで書かれてるから,g++でコンパイルするときはCだとおもってよろしくしてあげてね"ってことみたい.

Cで書かれたライブラリはCで使われることもC++で使われることもあるから,こういうコードでうまくその差を吸収してあげてるんだなー.

CとかC++のコードみてると,リンカとかメモリ効率とかLL使ってると触れられないところに触れられておもろい.

こちらの本が非常にくわしいです。

プログラミング言語C++第4版

プログラミング言語C++第4版