Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2010-03-26

[ruby]RubyのtimesとかeachをC言語のマクロで実装してみた

Rubyのtimes的なことをするのにいちいちfor文を書かなくていいようにならないかなと考えてみた。 ついでにeachとeach_with_indexも。

#include <stdio.h>

#define TIMES_DO(n, i) { int i; for(i = 0; i < n; i++) {
#define EACH_DO(a, e) { int __i__; typeof(a[0])* e; for(__i__ = 0; __i__ < sizeof(a) / sizeof(a[0]); __i__++) { e = &a[__i__];
#define EACH_WITH_INDEX_DO(a, e, i) { int i; typeof(a[0])* e; for(i = 0; i < sizeof(a) / sizeof(a[0]); i++) { e = &a[i];
#define END } }

int main(void)
{   
    char array[][8] = { "hello", "hi!", "bye" };

    TIMES_DO(5, i)
        printf("%d\n", i);
    END

    EACH_DO(array, e)
        printf("%s\n", *e);
    END

    EACH_WITH_INDEX_DO(array, e, i)
        printf("%d: %s\n", i, *e);
    END

    return 0;
}

実行結果

0
1
2
3
4
hello
hi!
bye
0: hello
1: hi!
2: bye

EACHの方はtypeofを使ってるのでgcc依存になってしまうみたい。

C++ならテンプレートを使ってtypeofをなくすことができそう。