这个宏怎么理解

wkdight 2011-10-10 09:45:32

#define TC_JOIN_ARGS(a,b) a##b
#define TC_JOIN(a,b) TC_JOIN_ARGS(a,b)
#define TC_UNUSED_VAR __attribute__ ((unused))

#define finally_do(code) \
struct TC_JOIN(Finally,__LINE__) \
{ \
TC_JOIN(~Finally,__LINE__) () { try { code } catch (...) { } } \
} \
TC_UNUSED_VAR \
TC_JOIN(finally,__LINE__)


然后这个宏这样调用:

finally_do ({ CoreService::Stop(); });
...全文
72 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wkdight 2011-10-10
  • 打赏
  • 举报
回复
这个宏也是别人的一小弟:


// Execute code with argument 'finally_arg' when leaving scope
#define finally_do_arg(argType, arg, code) \
struct TC_JOIN(Finally,__LINE__) \
{ \
TC_JOIN(Finally,__LINE__) (argType a) : finally_arg (a) { } \
TC_JOIN(~Finally,__LINE__) () { try { code } catch (...) { } } \
argType finally_arg; \
} \
TC_UNUSED_VAR \
TC_JOIN(finally,__LINE__) (arg)


这宏单独用真没什么用处,直接CoreService::Stop()清晰多了.
这里这样用,10有8,9是编程风格问题..
aizibion 2011-10-10
  • 打赏
  • 举报
回复
定义一个结构体,类型名是Finally加上代码行数,Finally234.
如##是串联的意思

定义该结构体的析构函数,并在其中执行code

声音一个临时变量,并未此变量去除未引用的编译警告,即__attribute__ ((unused))的用途

头大。。。

直接调用CoreService::Stop(); 岂不是更好
柯本 2011-10-10
  • 打赏
  • 举报
回复
展开后的finally_do ({ CoreService::Stop(); });

struct Finally17 { ~Finally17 () { try { { CoreService::Stop(); } } catch (...) { } } } __attribute__ ((unused)) finally17;

用到了__attribute__,一定是gcc的代码
fox000002 2011-10-10
  • 打赏
  • 举报
回复
把宏展开,就基本清楚了

可以看成一个类的析构里挂了某些停止服务或退出的代码

这个对象析构时自动调用这个代码

C++ 常用的一个技巧吧

64,682

社区成员

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

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