テストは通ってるけど、教科書からやり直しですねぇ。
#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