テストは通ってるけど、教科書からやり直しですねぇ。
#define TO_STRING(n, str) \ if(n != NULL) { \ sprintf(str, "%d", n); \ } else { \ char s = n; \ sprintf(str, "%s", &s); \ } // ↑NULL は何故かこうしないと正しく "" になってくれない! #define TEST(n, result) \ { \ char buffer[100]; \ \ TO_STRING(n, buffer); \ assert(strcmp(buffer, result) == 0); \ } int test() { TEST(-52, "-52"); TEST(-11, "-11"); TEST(-07, "-7"); TEST( 03, "3"); TEST( 05, "5"); TEST( 8, "8"); // 8 は何故か 08 って書くとエラー! TEST( 20, "20"); TEST( 34, "34"); TEST(NULL, ""); // 全てのテストが通ったことを確認。 12/08/16 }
使い方ヒント: 「これは臭う」という行を見付けたら、各行のをクリックしてマーキングしておきましょう(要Twitter OAuth認証)
TEST( 0, "0"); はやらなくて大丈夫なのかなー
うーん・・・ C++ならNULLは0だから・・・いやダメだろ!
うーん、香ばしい。
0から始まる数字は8進数として解釈されるのか。8進数とか使わないから初めて知ったわぁ。 まず、TO_STRINGの第一引数にNULLを指定すると、第2引数が""になるって仕様が違和感ありまくり。 それを是としても、line5,6はないわ…
if(hoge == foo) TO_STRING(10, str); else TO_STRING(20, str); とか書いたときにエラーが出て悩むパティーン
突っ込みどころ満載だけど、取り敢えず、マクロ使うなら(n) とか (str) とか括弧を付けましょう。 あと、NULLが0に展開されるのはC++で、もしかしてVisual Studio のVC++でソースファイル名の拡張子を省略した?C++としてコンパイルされるよ。拡張子「c」を明記すればNULL は((void*)0) に展開されるので純粋なC言語プログラムを書きたいときによい。
コメント投稿には、twitter認証が必要です。
Twitter認証
「8は何故か~」ツボったwwww