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