C++コードでextern "C"を使用する理由とは?
C++のコードの中で、C言語で実装・コンパイルされた関数を宣言して利用する場合には、「extern "C"」を指定する必要があります。
extern "C"の役割
extern "C"を付けることで、コンパイラに対して「C言語の名前付け規則(ネーミング規則)と呼び出し規約を使用したい」という意図を伝えることができます。その結果、コンパイラはC++コードの内部であっても、該当部分についてはC言語と同じ方式で処理を行うようになります。
なぜextern "C"が必要なのか?──名前マングリングの違い
この指定が必要になる根本的な理由は、C++コンパイラとCコンパイラでは、シンボルテーブルにおける関数名の扱い(名前マングリング)が異なるためです。
C++では、関数のオーバーロードなどの機能を実現するために、関数名に引数の型などの情報をエンコードした「修飾名(マングル名)」が生成されます。一方、C言語にはオーバーロードの概念がないため、関数名はほぼそのままの形でシンボルとして扱われます。
この違いにより、extern "C"を付けずにC言語製の関数を宣言すると、リンク時にシンボル名が一致せず、「未解決の外部参照(unresolved external symbol)」といったリンクエラーが発生してしまいます。
基本的な使い方の例
ヘッダファイルでCとC++の両方から利用できるようにする際は、次のように__cplusplusマクロと組み合わせて記述するのが一般的です。
#ifdef __cplusplus
extern "C" {
#endif
void my_c_function(int value);
#ifdef __cplusplus
}
#endif
このように書くことで、C++からコンパイルされる場合のみextern "C"が有効になり、Cコンパイラでコンパイルされる場合にも問題なく動作するヘッダを作成できます。
-
JavaScriptの「use strict」とは?厳格モード(Strict Mode)を使う理由と使い方を解説
JavaScriptのStrict Mode(厳格モード)とはStrict Mode(厳格モード)は、ECMAScript 5(ES5)で導入された機能で、プログラム全体、または特定の関数を「厳格」な実行コンテキストに置くことができます。この厳格なコンテキストでは、一部の安全でない操作が禁止され、通常よりも多くの例外がスローされます。その結果、開発者はエラーの原因をより詳しく把握できるようになります。サイレントエラーが顕在化するため、デバッグやコード品質の向上にも役立ちます。Strict Modeの主な特徴宣言されていない変数への代入が失敗します。たとえば foo = bar; のように、変数
-
HTMLドキュメントにDOCTYPE宣言が必要な理由とは?種類と書き方を徹底解説
HTMLにおける<!DOCTYPE>タグは、そのドキュメントがどのバージョンのHTMLで記述されているかをブラウザに伝えるためのものです。これを「文書型宣言」と呼びます。 <!DOCTYPE>宣言は、HTMLドキュメント内で最初に現れる要素であり、必ず<html>タグよりも前に記述します。また、<!DOCTYPE>タグには終了タグが存在しない点にも注意しましょう。 DOCTYPE宣言を正しく記述することで、ブラウザは標準準拠モード(スタンダードモード)でページをレンダリングします。逆に宣言がない場合、ブラウザが互換モード(クワークスモード)で動作