2016-05-22 10 views
3

整数リテラル、または整数リテラルに似たもの、および別のマクロの名前をとるCマクロを記述し、他のマクロを整数リテラルの値として何度も展開し、インデックスをas議論、例えば任意のマクロを一定回数展開するマクロですか?

例えば:

MAGIC(4, FUN) 

は、代わりに、私は範囲の開始および長さをとるMORE_MAGICを有することになる場合、それはさらによりよいであろう

FUN(0) FUN(1) FUN(2) FUN(3) 

に展開します

MORE_MAGIC(1, 3, FUN) 

FUN(1) FUN(2) FUN(3) 

注意に展開:私は知らないに限定されている拡張の数、一緒に暮らすことができる

  • 、99、または50、またはそのような何か。
  • FUNに関する仮定はできません。一般的なニーズ。そして、いいえ、これは手動でループをアンロールするためのものではありません。
  • Cのみのソリューションは、C++を必要とするソリューション(たとえば、ソリューションでテンプレートを何らかの形で使用する場合など)が最も歓迎されます。
  • ソリューションの行の総数(#includeのコメントを除く)は、できるだけ小さい方が望ましいです。いいえ、200を超えないでください。
+0

なぜこれが欲しいですか? forループへの拡張はどうですか? – Schwern

+0

「FUNに関する仮定はできません」と「テンプレートを使用する」は基本的に互換性がありません。テンプレートの使用を許可することで、人々はFUNについての前提を作ることができます。なぜあなたはあなたがあなたが一番よく知っていると思うので、これを望んでいるのか言いたくないように聞こえますが、あなたの質問の注釈は私にそれを疑います。 – hvd

+0

また、あなたが求めたものを明確に提供した既存の回答を失格とする質問を編集することは、あまり行われていないため、既に知っているはずです。 – hvd

答えて

9

ブーストプリプロセッサは、このようなプリプロセッサの魔法に焦点を当てた広範なライブラリです。

マクロは、BOOST_PP_REPEAT_FROM_TOというマクロを提供しています。

完全なリファレンスは、ここに提供されています:
http://boost.org/libs/preprocessor

+0

で自宅にいるような感じです。Boost Preprocessorライブラリのすべてを除いて 'BOOST_PP_REPEAT_FROM_TO'だけを抽出することはできますか? – einpoklum

+0

@einpoklum私の理解では、Boost Preprocessorライブラリはスタンドアロンであり、Boostの残りの部分は必要ありません。 Boost Preprocessorから個々のコンポーネントを抽出できるかどうかはわかりませんが、 – templatetypedef

+0

"Modular Boost"プロジェクトの努力により、PPのスタンドアローン版が利用可能となります(https://github.com/boostorg/preprocessor)。 'REPEAT_FROM_TO'だけを抽出するのはかなり困難ですが、に必要なビットだけを含めることができます – zah

-2

あなたが望む基本的にループのアンロールです...しかし、あなたはそれをしたいなぜあなたは言いませんでした。 forループを作成するマクロを作成して、コンパイル時に展開する価値があるかどうかを判断することができます。

#include <stdio.h> 

#define PRINT_INT(i) printf("%d\n", i); 
#define MORE_MAGIC(start, end, function) for(int i = start; i <= end; i++) { function(i); } 
#define MAGIC(end, function) MORE_MAGIC(0, end, function) 

int main() { 
    puts("MAGIC!"); 
    MAGIC(3, PRINT_INT); 

    puts("MORE_MAGIC!"); 
    MORE_MAGIC(2, 6, PRINT_INT); 

    return 0; 
} 
+0

これは私の質問に答えません。また、編集を参照してください。また、たくさんのprintf命令を出しています! – einpoklum

+0

@einpoklumあなたがなぜこれを必要としているのか、そしてforループがしない場合のいくつかを教えてもらえれば、より良い答えを得ることができます。私が考えることができるのは変数を宣言することだけです。マクロを必要とする非常に多くの番号付き変数を宣言したいのであれば、そんなに多くの変数が必要な理由を考え直すべきでしょう。 – Schwern

+0

@einpoklum "あなたは何百万ものprintf命令を出していますか?"それは11行を印刷し、デモンストレーションの目的に過ぎません。あなたの編集は質問を大きく変えないようです。これが何であるかを言いたくなければ、あなたの呼び出しは、私にはあまり意味がありません。 – Schwern

関連する問題