C言語で信号処理

私の趣味からいうと、信号処理プログラミングはC言語よりC++言語のほうが向いています

抽象データ化
たとえばFIRフィルタを考えてみると、内部状態変数(バッファ)、係数配列、データポインタ、タップ数といった変数群が組で使われます。これらの組がフィルタの個数だけ存在し、初期化や場合によっては終了処理が必要になります。したがって、フィルタは抽象データ型とし、必要なメソッドとがっちり結合させるほうがすっきりします。
よりよい言語
名前空間がある、というそれだけでもC++言語を使う理由になります。

が、しかし。PizzaFactoryのExpress版はC++言語に対応しないとサポート掲示板で宣言がありました。お試し版の位置づけですからいたし方ありません。
C言語で行う擬似オブジェクト指向プログラミングについては、いくつもの方法が提案されています。これらについて検討してみましたが、FIRフィルタやオシレータといったソフトウェア部品の範疇に留まる限り、擬似OOPは弊害のほうが大きいという結論になりました。
擬似OOPの弊害をいかに説明します。まず、C++言語によるフィルタの例を見てください。runメソッドにより実際のフィルタリングを行います。引数は入力データ列、出力バッファ、処理するデータ個数です。

filter.run( input, output, 32 );

これをC言語の擬似OOPにすると次のようになります。

filter.run( &filter, input, output, 32 );

C++言語はデータ型に格納した関数へのポインタから関数呼び出しを行う際*1、関数にデータへのポインタを暗黙に渡してくれます。C言語にはこの機能はありません。そのため、runメソッドの引数として明示的にデータへのポインタを渡す必要があります。その結果、データを明示的に二度、示さなければなりません。その二つを間違えて違うものにする可能性は高いです。そして見つけにくいバグを引き起こします。
それならば、いっそ古典的に以下のようなものにしたほうがましです。

fir( &filter, input, output, 32 );

と、いうことで今後のソフトウェア開発は古典的な記法で進めることにしました。しかし名前空間が使えないのは残念だなぁ。

*1:つまりメソッド呼び出しを行うとき