乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 164|回复: 9

错误消息的宏

[复制链接]

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-4-3 12:31:08 | 显示全部楼层 |阅读模式
有人使用宏来让检查函数状态变得更容易吗?
如果是这样,你有一个很酷的分享吗?

  1. #define MSGNOK(statement)  { Acad::ErrorStatus st = (statement); if (st != Acad::eOk)\
  2.   acutPrintf(_T("\nError: Line %ld [%s]\nIn function %s"),\
  3.   __LINE__, acadErrorStatusText(st),_T(__FUNCTION__));}


qamhmms4ttn.png

qamhmms4ttn.png

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-4-3 13:33:49 | 显示全部楼层

不是我......
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-4-3 21:55:25 | 显示全部楼层
看起来很整洁,我会用这些派对一会儿,看看它是如何工作的
  1. define ISEOKRET(statement)  { Acad::ErrorStatus st = (statement); if (st != Acad::eOk){\
  2.   acutPrintf(_T("\nError: Line %ld [%s]\nIn function %s"),\
  3.   __LINE__, acadErrorStatusText(st),_T(__FUNCTION__)); return st; }}
  4. #define ISEOKMSG(statement)  { Acad::ErrorStatus st = (statement); if (st != Acad::eOk)\
  5.   acutPrintf(_T("\nError: Line %ld [%s]\nIn function %s"),\
  6.   __LINE__, acadErrorStatusText(st),_T(__FUNCTION__));}

回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-4-3 22:27:45 | 显示全部楼层

我见过它们,但到目前为止还不需要它们
  1. inline int
  2. EOK(Acad::ErrorStatus arg)
  3. {
  4. return arg == Acad::eOk;
  5. }
  6. Acad::ErrorStatus es;
  7. es = acdbOpenObject(pBlockRef, blkRefIds[i], AcDb::kForWrite);
  8. if (!EOK(es))
  9. break;
  10. inline AcDbDatabase *
  11. CURDB()
  12. {
  13. return acdbHostApplicationServices()->workingDatabase();
  14. }
  15. AcDbBlockTablePointer pBlockTable(CURDB(), AcDb::kForRead);
  16. #define ASSERTREADENABLED \
  17.         HRESULT _hr; \
  18.         if FAILED(_hr=assertReadEnabled()) \
  19.                 return _hr;
  20. #define ASSERTWRITEENABLED \
  21.         HRESULT _hr; \
  22.         if FAILED(_hr=assertWriteEnabled()) \
  23.                 return _hr;

嗯......现在我记得,曾经使用过它们......几年前-如果我在这里发现更多关于我的样品将发布它们。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-4-3 22:36:12 | 显示全部楼层
我想对于大多数人来说,只返回错误状态是可以的,但是对于像我这样的新手来说,我需要指向问题发生的代码中的确切行。我想我可以使用ASSERT,但那也不好玩
类似这样的
  1. Acad::ErrorStatus
  2. DatabaseTools::AddToModelSpace(AcDbEntity *pEntity, AcDbObjectId &ID, AcDbDatabase *pDb)
  3. {
  4.   if(pEntity == NULL) { ISEOKRET(Acad::eNullEntityPointer); }
  5.   Acad::ErrorStatus        es;
  6.   AcDbBlockTable        *pBlockTable = NULL;
  7.   AcDbBlockTableRecord  *pBlockTableRecord = NULL;
  8.   es = pDb->getSymbolTable(pBlockTable, AcDb::kForRead);
  9.   ISEOKRET(es);
  10.   es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
  11.   pBlockTable->close();
  12.   ISEOKRET(es);
  13.   es = pBlockTableRecord->appendAcDbEntity(ID, pEntity);
  14.   ISEOKMSG(es);
  15.   es = pEntity->close();
  16.   ISEOKMSG(es);
  17.   es = pBlockTableRecord->close();
  18.   ISEOKMSG(es);
  19.   return es;
  20. }

回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-4-3 22:39:40 | 显示全部楼层
虽然在C++中通常避免使用宏,但它是一种非常强大的编码工具,可以节省您大量的手工编码,唯一的缺点是,如果您不知道它们是如何工作的,它们会使代码看起来有点神秘。ARX也使用了相当多的宏,特别是使用自定义对象来填充大量的锅炉板代码,一旦你明白它们只是一个为你自动编写代码的预处理工具,而不是一些特殊的编译代码,它们实际上是非常整洁的。有点像代码片段,但它们会为您填补“空白”。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-4-3 22:40:10 | 显示全部楼层
宏看起来很丑....我简单地结束使用这样的东西,例如:
  1. static AcDbObjectId AddEntityToDataBase(AcDbEntity *pEnt, Adesk::UInt16 color = 7)
  2. {
  3.         AcDbObjectId pOutputId = AcDbObjectId::kNull;
  4.         AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
  5.         AcDbBlockTableRecordPointer pBTR(pDb->currentSpaceId(), AcDb::kForWrite);
  6.         if (pEnt && Acad::eOk == pBTR.openStatus())
  7.         {
  8.                 pEnt->setDatabaseDefaults();
  9.                 pEnt->setColorIndex(color);
  10.                 pBTR->appendAcDbEntity(pOutputId, pEnt);
  11.                 pEnt->close();
  12.         }
  13.         return pOutputId;
  14. }

或众所周知的....
  1. bool postToDatabase (AcDbObjectId blkName, AcDbEntity *pEntity)
  2. {
  3.         AcDbBlockTableRecordPointer pBlk(blkName, AcDb::kForWrite);
  4.         if (pBlk.openStatus() != Acad::eOk) return (false);
  5.         return (pBlk->appendAcDbEntity(pEntity) == Acad::eOk);
  6. }

编码看起来更清晰....国际海事组织;依我之见
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-4-3 22:40:45 | 显示全部楼层
最近我开始做一些事情,比如代码7]
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-4-3 22:45:58 | 显示全部楼层
这样做的一个副作用是多个错误消息,..堆栈跟踪 ?
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-4-3 23:01:59 | 显示全部楼层
我找不到我正在寻找的链接,但它类似于“编写有效的C”,但快速搜索未能找到它,它更基于C,但非常有帮助,并涵盖了错误和宏等内容。
看看ARX宏(转到定义),看看它们是如何完成繁重的工作的,基本上您用1个或多个关键字编写宏一次,这些关键字被替换为调用宏时使用的关键字,基本上预处理器用代码替换宏(这可能是很多行!)宏表示在它的位置上,这节省了大量的输入和可能的错误。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-6-6 18:43 , Processed in 0.325198 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表