#include <iostream>
using namespace std;
#define EPS (1e-7)
#define INF 1e9
int main() {
cout << EPS << endl;
cout << INF << endl;
return 0;
}
#include <iostream>
using namespace std;
#define REP(i,n) for(int i = 0; i < (int)n; ++i)
// #define REP(i, n) for(int i = 0; i < (int)n; ++i) // 引数括弧内の空白は問題ないですが
// #define REP (i,n) for(int i = 0; i < (int)n; ++i) // それ以外だと意図しない置換が行われます
#define rep(n) REP(i,n)
int main() {
REP(i,10) {
cout << i << endl;
}
rep(10) {
cout << i << endl;
}
return 0;
}
閉じ括弧の後のセミコロンは置換後の文字列として扱われます。
#include <iostream>
using namespace std;
#define MyMacro(expr); expr; //「MyMacro(expr)」→「; expr;」
int main() {
MyMacro(cout << "macro" << endl);
//==> こうはならず:
// cout << "macro" << endl;
//==> こうなります:
// ; cout << "macro" << endl;
return 0;
}
#include <iostream>
using namespace std;
#define MyMacro(expr) expr // 不適切
// #define MyMacro(expr) (expr) // 可能な限り多くの括弧で囲みましょう
int main() {
cout << MyMacro(1 + 1) * 2 << endl; //=> 3 (← 意図した 4 にはならない)
return 0;
}
バックスラッシュを使用するとマクロ内で改行できます。最後の行のバックスラッシュは不要です。
#include <iostream>
using namespace std;
#define MyMacro(expr) \
{ \
while(true) { \
(expr); \
} \
}
int main() {
MyMacro(cout << "infinite loop" << endl);
return 0;
}
プリプロセッサによるマクロの置換時にバックスラッシュ改行部分が一行にまとめられてしまうため、「// コメント」ではなく「/* コメント */」形式を使用する必要があります。
#include <iostream>
using namespace std;
#define MyMacro(expr) \
{ \
while(true) { /* コメント */ \
(expr); \
break; \
} \
}
int main() {
MyMacro(cout << "infinit" << endl);
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
#define PI (acos(-1))
int main() {
cout << PI << endl; //=> 3.14159
#undef PI
// cout << PI << endl; // ← マクロ定義がないためエラー
return 0;
}