这样可以把不同功能段的代码进一步封装起来
#define BEGINS(x) namesapce x{
#define ENDS(x) }
BEGINS(TEST1)
void func() {
printf("hello world");
}
int main() {
func();
return 0;
}
ENDS(TEST1)
BEGINS(TEST2)
... // 功能段
ENDS(TEST2)
int main() {
TEST1::main(); // 执行TEST1空间下的main函数
TEST2::main(); // 执行TEST2空间下的main函数
}
比如下面的batch
#define batch 500000
thread *t[10];
int ret[10];
for (int i = 0, j = 1; i < 10; i++, j += batch) {
t[i] = new thread(worker, j, j + batch - 1, ref(ret[i]));
}
for (auto x : t) x->join();
int ans = 0;
for (auto x : ret) ans += x;
for (auto x : t) delete x;
cout << ans << endl;
#undef batch
一般只需要在项目的head.h中加入以下定义:
#ifdef _D
#define DBG(fmt, args...) printf(fmt, ##args) // ##的作用和#的作用差不多,都是起到连接的作用,但是##如果args可变参列表没有内容,会把前面的逗号,也去掉。
#else
#define DBG(fmt, args...)
#endif
然后就可以在file.c
文件中关键位置打印调试信息:DBG("debug info")
在程序编译的时候选择是否进入调试模式:g++ file.c -D _D
,其中-D _D
就是开启调试模式的意思。