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をなくすことができそう。