__im_##什么意思?怎么用?

tangqj0920 2009-12-14 01:44:50
请用过这种语句的大拿们帮帮忙忙
__im_##具体怎么理解啊?

#ifdef TEST
#define TEST_DEL(x) x
#else
#define TEST_DEL(x) __im_##x
#endif

int func(void);

int TEST_DEL(func)(void)
{
return 0;
}




...全文
303 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
http://blog.csdn.net/hairetz/archive/2009/11/08/4785047.aspx

耐心看完这篇文章,对你有帮助的。
tangqj0920 2009-12-14
  • 打赏
  • 举报
回复
很感谢楼上的详细说明啊!

也谢谢3楼的例子!
「已注销」 2009-12-14
  • 打赏
  • 举报
回复
当然,作业不止于此,有的时候,为方便编码,用宏结合##实现,还是很爽的。
比如:
#define SEND_EVENT(EVT) SEND_##EVT(EVT)

#define EVENT_GET_ID(EVT) template<typename T> static WORD GetEventId() { return T::Id##EVT; }

#define EVENT_SENDER_BEGIN(EVT) if (m_evtFlag.Size() > Id##EVT && m_evtFlag[Id##EVT]) {

#define EVENT_SENDER_END(EVT, VALUE) \
for (WORD i = 0; i < m_evtObj.Size(); ++i) \
{ \
if (m_evtObj[i].id == Id##EVT) \
{ \
(*static_cast<Event<EVT>*>(m_evtObj[i].obj))(VALUE); \
if (i > Id##EVT) \
{ \
m_evtObj.Swap(i, Id##EVT); \
m_evtObj.Resize(m_evtObj.Size()); \
} \
break; \
} \
} \
}


// WM_CREATE
#define SEND_EvtCreate(EVT) \
case WM_CREATE: \
EVENT_SENDER_BEGIN(EVT) \
EVT evt(m_wnd, this, reinterpret_cast<LPCREATESTRUCT>(lpa), res, user, false); \
EVENT_SENDER_END(EVT, evt); \
break
struct EvtCreate
{
EvtCreate(HWND w, Widget* o, LPCREATESTRUCT c, LRESULT& r, bool& u, bool s)
: wnd(w), owner(o), createStruct(c), res(r), user(u), stop(s) {}
HWND wnd;
Widget* owner;
LPCREATESTRUCT createStruct;
LRESULT& res;
bool& user;
bool stop;
EVENT_GET_ID(EvtCreate);
};
「已注销」 2009-12-14
  • 打赏
  • 举报
回复
比如我的类中实现:
#define IMPLEMENT_EVENT(EVT) Event<EVT>& qp##EVT() { return RegisterEvent<EVT>(); }
「已注销」 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tangqj0920 的回复:]
引用 2 楼 loaden 的回复:
让int TEST_DEL(func)(void)
变成:
int __im_func(void)


谢谢
能不能再帮忙解释一下,
变成__im_func()的目的是什么啊?不太了解,
[/Quote]
避免与其他函数名同名。
M_S_D_N 2009-12-14
  • 打赏
  • 举报
回复
dll中导出的某些类型函数前会加这个前缀。
tangqj0920 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 loaden 的回复:]
让int TEST_DEL(func)(void)
变成:
int __im_func(void)
[/Quote]

谢谢
能不能再帮忙解释一下,
变成__im_func()的目的是什么啊?不太了解,
sduxiaoxiang 2009-12-14
  • 打赏
  • 举报
回复
连接符
guzhijie1981 2009-12-14
  • 打赏
  • 举报
回复
#define TEST_DEL(x) __im_##x

就是x用 __im_x表示;比如说TEST_DEL(4) 就是__im_4
mstlq 2009-12-14
  • 打赏
  • 举报
回复
  #define GPEBLT_FUNCNAME(basename) (SCODE (GPE::*)(struct GPEBltParms *))&GPE::##basename
  在#define中,标准只定义了#和##两种操作。#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串。
  #include <stdio.h>
  #define paster( n ) printf( "token " #n" = %d\n ", token##n )
  int main()
  {
  int token9=10;
  paster(9);
  return 0;
  }
  输出为
  [leshy@leshy src]$ ./a.out
  token 9 = 10
「已注销」 2009-12-14
  • 打赏
  • 举报
回复
让int TEST_DEL(func)(void)
变成:
int __im_func(void)
「已注销」 2009-12-14
  • 打赏
  • 举报
回复
连接符

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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