このようなテンプレートの場合、マクロへのかなり簡単な変換があります。構文上の主な問題は、結果の配列を返すことができないことです。これを書き込む変数は、別のパラメーターである必要があります。
#define map(func_, input_, output_, type_, n_) do { \
output_ = xmalloc(sizeof(type_) * (n_)); \
size_t i_; \
for (i_ = 0; i_ < (n_); i_++) \
output_[i_] = func_(input_[i_]); \
} while (0)
コンパイラの警告に注意を払えば、これは見た目ほどタイプセーフではありません。ただし、このマクロの使用に対する実際の引数のいずれかが単純な識別子でない場合は、特に安全ではありません。最も重要なことは、実際の議論のいずれかに副作用がある場合、壊滅的な事態が発生することです。
結果の配列を返すことができないのと同様に、これは解決できますが、GNU拡張機能を使用する意思がある場合に限ります...
#define gnumap(func_, input_, type_, n_) ({ \
__typeof(func_) func__ = (func_); \
__typeof(input_) input__ = (input_), \
output__ = xmalloc(sizeof(type_) * n__); \
__typeof(n_) n__ = (n_), \
i__; \
for (i__ = 0; i__ < n__; i__++) \
output__[i__] = func__(input__[i__]); \
/* return */ output__; \
})
実生活でこれらのいずれかを実行しますか?おそらくそうではありませんが、実際に利用可能な最も悪いオプションである場合もあります。これは、アセンブリ言語でその重要な内部ループを書き直すことを恥ずかしがる一歩と考えてください。
(xmalloc
これに慣れていない場合は、malloc
プログラム全体を成功またはクラッシュさせるユーザー作成ラッパーの従来の名前です。ここでは、malloc
失敗に対処する方法の問題を回避するために使用します。)