如何在宏 #define中使用大括号中的内容作为参数

lixianmin 2009-04-13 10:55:41
我的目标利用全局变量写一个用于单元测试的宏,目前只能实现成如下样子:
#define UNIT_TEST(func, x) \
class UnitTest##func\
{\
public:\
UnitTest##func(void)\
{\
x\
}\
};\
UnitTest##func unitTest##func;

比如,对一个类Demo:
class Demo
{
public:
int Add(int a, int b)
{
return a+b;
}
};

测试里面的Add函数,可以写成如下样子:

UNIT_TEST(Add,
{
Demo demo;
int a= 4;
int b=5;
assert(9==demo.Add(a, b));
})

该测试代码写在cpp文件中,这样,当debug版程序启动的时候,上述的测试代码将自动执行(release版不会执行),大家可以看到,测试代码主体实际上是写在小括号中的()。我的问题是,有没有办法将其改成写在大括号{}中的形式
即改成这样:


UNIT_TEST(Add)
{
Demo demo;
int a= 4;
int b=5;
assert(9==demo.Add(a, b));
}
...全文
867 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixianmin 2009-04-14
  • 打赏
  • 举报
回复
嗯, 感谢各位, 我再想想看
LemIST 2009-04-13
  • 打赏
  • 举报
回复
C++中的宏其实就是个文本替代,你最后要的是
class UnitTestAdd
{
public:
UnitTestAdd(void)
{
{
Demo demo;
int a= 4;
int b=5;
assert(9==demo.Add(a, b));
}

}
};
UnitTestAdd unitTestAdd;

单个宏是实现不了这样的替换的。
UNIT_TEST(Add)
{
Demo demo;
int a= 4;
int b=5;
assert(9==demo.Add(a, b));
}

//
可以考虑使用两个宏。
#define BeginUnitTest(func)\
class UnitTest##func \
{ \
public: \
UnitTest#func(void) \
{
#define EndUnitTest(func)\
} \
}; \
UnitTest##func unitTest#func;

然后可以写:
BeginUnitTest(Add)
{
Demo demo;
int a= 4;
int b=5;
assert(9==demo.Add(a, b));
}
EndUnitTest(Add)
taodm 2009-04-13
  • 打赏
  • 举报
回复
自己找份cppunitlite源码就能学会这种高阶宏了。
ltc_mouse 2009-04-13
  • 打赏
  • 举报
回复
用了两个宏,形式一致了,不过似乎没办法在不Debug时自动无效啊...
在不debug时使用if(0)?

#define UNIT_TEST_BEGIN(func) \
class UnitTest##func \
{\
public: \
UnitTest##func(void)\
{

#define UNIT_TEST_END(func) \
} \
}; \
UnitTest##func unitTest##func;

//使用例子:
UNIT_TEST_BEGIN(Add)
{
Demo demo;
int a= 4;
int b=5;
assert(9==demo.Add(a, b));
}
UNIT_TEST_END(Add)
baihacker 2009-04-13
  • 打赏
  • 举报
回复
一般是用具有某个签名的"动作对象"(封装某个行为)的容器.
然后将这些行为加到容器中,最后遍历容器,输出接口.

当然你封装一个动作对象,对于某个普通函数,很好办,用一个函数指针就搞定了.
但是某个类的某个方法呢?

在MCD上有实现.

一般不像楼主这样的.

cppunit里面更是雷人,一个"动作"用N多设计模式.

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧