C LANGUAGE TECHNOLOGY

C言語でC++言語の機能を模倣する方法

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity/Vyper,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

C言語でC++言語みたいにコードを書けたら便利だと思ったことはありませんか?

そんなあなたにC言語でC++言語の機能を模倣する方法を紹介します.

基本的にはGCC/Clangの拡張機能を利用しますので,Visual Studioでは動作しないことに注意して下さい.

コンストラクタとデストラクタ

C++言語ではクラスを生成,破棄する際にコンストラクタとデストラクタが呼ばれます.

実行結果は以下になります.

C言語でコンストラクタとデストラクタを模倣するためには,以下のGCC/Clangの拡張機能を利用します.

  • コンストラクタ: __attribute__((constructor))
  • デストラクタ:__attribute__((destructor))

C言語のコードは以下になります.

実行結果は以下になります.

関数のオーバーロード

C++ではクラスのメンバ関数のオーバーロードができます.

実行結果は以下になります.

C11規格の総称選択(Generic Selection)

C11規格の総称選択(Generic Selection)を利用すると,C++言語のオーバーロードを模倣することができます.

C++言語のオーバーロードとは異なり,C11規格の総称選択は引数の個数が同じでない(引数がない)場合は利用できないことに注意して下さい.

※引数の個数が可変の可変長引数を利用すれば,制限付きで可能になります.

まずは総称選択を知りたいあなたはこちらからどうぞ.

C言語 _Generic
【C言語】総称選択_Genericの使い方

こういった悩みにお答えします. こういった私から学べます. 目次1 総称選択_Generic2 _Genericの構文と制約3 引数が1つの場合の_Genericの使い方4 引数が2つの場合の_Gen ...

続きを見る

C11規格の総称選択を利用するコードは以下になります.

※print_hello関数の引数がない場合は削除しています.

実行結果は以下になります.

Clangの拡張機能「__attribute__((overloadable))」

Clangの拡張機能「__attribute__((overloadable))」を利用することで,C++言語のオーバーロードを模倣することができます.

C11規格の総称選択とは異なり,Clangの拡張機能「__attribute__((overloadable))」は引数の個数が異なる場合でも利用できます.

ただし,GCCでは「__attribute__((overloadable))」が機能せず,ビルドが失敗することに注意して下さい.

Clangの拡張機能「__attribute__((overloadable))」を利用するコードは以下になります.

実行結果は以下になります.

関数のオーバーライド

C++での関数のオーバーライドは,子クラスが親クラスのメンバ関数を上書きすることです.

実行結果は以下になります.

C言語で関数のオーバーライドをするためには,GCC/Clangの拡張機能の「__attribute__((weak))」を利用します.

__attribute__((weak)を利用する関数と同じ名前の関数は別ファイルで定義する必要があることに注意して下さい.

同じファイルで両方の関数を定義するとビルドエラーになります.

C言語で__attribute__((weak)を利用するコードは以下になります.

実行結果は以下になります.

override.cのみをビルドして実行すると「Hello!」と表示されます.

これに対して,override.cとoverride2.cをビルドして実行すると「Hello World!」と表示されます.

この理由は,override2.cにあるprint_hello関数が,override.cにあるprint_hello関数をオーバーライドしたからです.

まとめ

C言語でC++言語の機能を模倣する方法を紹介しました.

具体的には,コンストラクタとデストラクタ,関数のオーバーロード,関数のオーバーライドを解説しました.

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!

友だち追加

独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , , , , , ,