printf( "変数名 = %d\n", 変数名 );int型変数がいくつもあるなら、指定した各々の変数に応じて変数名のところが置き換わるマクロがあると、便利ですね。
#define PR_INT1(x) printf(#x " = %d\n", (x))
マクロのパラメタの前に # をつけると、パラメタを "" で挟んだ文字列に置換されます。
PR_INT1(num); は、printf("num" " = %d\n", (num)); へ
ダブルクォートで囲んだ文字列が並んでいますが、C言語では隣接する文字列定数は連結されて1つの文字列になります。#define PR_FMT(f,x) printf(#x " = %"#f"\n", (x))このマクロは、たとえば次のように置換されます。
PR_FMT(2d,num);は printf( "num" " = %""2d""\n", (num)); PR_FMT(5.1f,val);は printf( "val" " = %""5.1f""\n", (val));
#include <stdio.h> #define PR_DBL2(x,y) printf(#x " = %f, "#y " = %f\n",(x),(y)) #define PR_FMT(f,x) printf(#x " = %"#f"\n", (x)) // BMI指数を求めて返す double getBmi( double h, double w ) { double hm = h * 0.01; //身長をm単位に変換する PR_DBL2( hm, w ); return w / ( hm * hm ); //bmi = w/(hm * hm) } main() { double h, w, bmi; printf( "身長, 体重を指定してください\n" ); if( scanf( "%lf, %lf", &h, &w ) == 2 ) { bmi = getBmi( h, w ); PR_FMT( .2f, bmi ); if( bmi < 18.5 ) printf( "やせ型です\n" ); else if( bmi < 25.0 ) printf( "標準です\n" ); else printf( "肥満です\n" ); } }実行結果
身長, 体重を指定してください
170.0, 56.5
hm = 1.700000, w = 56.500000
bmi = 19.55
標準です
赤文字がマクロによる表示です。
それぞれ指定した変数名とともに、その値が表示されています。
(今週のクイズです)
#define DEBUG の定義があるときだけ、getBmi や main のマクロ実行が行われるようにするには、どうすればよいでしょう?
(答えは、次回のC言語の Tips で)
[ 関連記事 ] マクロは機械的に置換するので注意
main() { int n; printf( "%dを超えない最大の素数は・・・ ", LIMIT ); n = ( LIMIT>2&&LIMIT%2 == 0 ? LIMIT-1 : LIMIT ); while( n >= 2 ) { if( isPrimeNum( n ) ) { printf( "%d\n", n ); break; } n -= 2; } }