今年の秋頃に入ってから(マウスのプログラムがややこしくなってから),CからC++での開発に切り替えました。

が,それが影響して全然コンパイルが通らない現象に見舞われたので,原因と対処法をまとめておきます。

○はじめから存在していた以下のコードを必ず含めておく。

#ifdef __cplusplus
extern "C" {
void abort(void);
}
#endif

#ifdef __cplusplus
void abort(void){
}
#endif

コンパイラのドキュメントを読めば書いてあったような気がしますが,どこか忘れちゃったので思い出したら追記しておきます。

○外部の".c",".h"ファイルで宣言されている関数を呼び出す際,もしくは変数を外部参照する際,必ず次の通りにする(と思います。ミスがあれば報告いただけると幸いです)。

例."interrupt_handlers.c"で宣言した割り込み動作時に呼び出す関数を使用する際,その定義を行ったファイル内に次のコードを追記しておく。

#ifdef __cplusplus
extern "C" void interrupt_CMT0();
extern "C" void interrupt_CMT1();
#endif

これは「マングリング」とやらが影響しているようです。

手伝っていただいたサークルの先輩,また次のサイトの作者様,ありがとうございます。

参考: マングリング - debian36の日記

参考: extern "C" - debian36の日記


マングリングなどという現象があるとはいえ,C++を使うメリットはかなり大きいと思います。

が,ルネサスコンパイラは標準ライブラリが少ないので全然使い物になりません。

その話はまた後日したいと思います。