错误消息的宏
有人使用宏来让检查函数状态变得更容易吗?如果是这样,你有一个很酷的分享吗?
即
#define MSGNOK(statement){ Acad::ErrorStatus st = (statement); if (st != Acad::eOk)\
acutPrintf(_T("\nError: Line %ld [%s]\nIn function %s"),\
__LINE__, acadErrorStatusText(st),_T(__FUNCTION__));}
**** Hidden Message *****
不是我...... 看起来很整洁,我会用这些派对一会儿,看看它是如何工作的
define ISEOKRET(statement){ Acad::ErrorStatus st = (statement); if (st != Acad::eOk){\
acutPrintf(_T("\nError: Line %ld [%s]\nIn function %s"),\
__LINE__, acadErrorStatusText(st),_T(__FUNCTION__)); return st; }}
#define ISEOKMSG(statement){ Acad::ErrorStatus st = (statement); if (st != Acad::eOk)\
acutPrintf(_T("\nError: Line %ld [%s]\nIn function %s"),\
__LINE__, acadErrorStatusText(st),_T(__FUNCTION__));}
我见过它们,但到目前为止还不需要它们
inline int
EOK(Acad::ErrorStatus arg)
{
return arg == Acad::eOk;
}
Acad::ErrorStatus es;
es = acdbOpenObject(pBlockRef, blkRefIds, AcDb::kForWrite);
if (!EOK(es))
break;
inline AcDbDatabase *
CURDB()
{
return acdbHostApplicationServices()->workingDatabase();
}
AcDbBlockTablePointer pBlockTable(CURDB(), AcDb::kForRead);
#define ASSERTREADENABLED \
HRESULT _hr; \
if FAILED(_hr=assertReadEnabled()) \
return _hr;
#define ASSERTWRITEENABLED \
HRESULT _hr; \
if FAILED(_hr=assertWriteEnabled()) \
return _hr;
嗯......现在我记得,曾经使用过它们......几年前-如果我在这里发现更多关于我的样品将发布它们。 我想对于大多数人来说,只返回错误状态是可以的,但是对于像我这样的新手来说,我需要指向问题发生的代码中的确切行。我想我可以使用ASSERT,但那也不好玩
类似这样的
Acad::ErrorStatus
DatabaseTools::AddToModelSpace(AcDbEntity *pEntity, AcDbObjectId &ID, AcDbDatabase *pDb)
{
if(pEntity == NULL) { ISEOKRET(Acad::eNullEntityPointer); }
Acad::ErrorStatus es;
AcDbBlockTable *pBlockTable = NULL;
AcDbBlockTableRecord*pBlockTableRecord = NULL;
es = pDb->getSymbolTable(pBlockTable, AcDb::kForRead);
ISEOKRET(es);
es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
pBlockTable->close();
ISEOKRET(es);
es = pBlockTableRecord->appendAcDbEntity(ID, pEntity);
ISEOKMSG(es);
es = pEntity->close();
ISEOKMSG(es);
es = pBlockTableRecord->close();
ISEOKMSG(es);
return es;
}
虽然在C++中通常避免使用宏,但它是一种非常强大的编码工具,可以节省您大量的手工编码,唯一的缺点是,如果您不知道它们是如何工作的,它们会使代码看起来有点神秘。ARX也使用了相当多的宏,特别是使用自定义对象来填充大量的锅炉板代码,一旦你明白它们只是一个为你自动编写代码的预处理工具,而不是一些特殊的编译代码,它们实际上是非常整洁的。有点像代码片段,但它们会为您填补“空白”。
宏看起来很丑....我简单地结束使用这样的东西,例如:
static AcDbObjectId AddEntityToDataBase(AcDbEntity *pEnt, Adesk::UInt16 color = 7)
{
AcDbObjectId pOutputId = AcDbObjectId::kNull;
AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
AcDbBlockTableRecordPointer pBTR(pDb->currentSpaceId(), AcDb::kForWrite);
if (pEnt && Acad::eOk == pBTR.openStatus())
{
pEnt->setDatabaseDefaults();
pEnt->setColorIndex(color);
pBTR->appendAcDbEntity(pOutputId, pEnt);
pEnt->close();
}
return pOutputId;
}
或众所周知的....
bool postToDatabase (AcDbObjectId blkName, AcDbEntity *pEntity)
{
AcDbBlockTableRecordPointer pBlk(blkName, AcDb::kForWrite);
if (pBlk.openStatus() != Acad::eOk) return (false);
return (pBlk->appendAcDbEntity(pEntity) == Acad::eOk);
}
编码看起来更清晰....国际海事组织;依我之见 最近我开始做一些事情,比如代码7] 这样做的一个副作用是多个错误消息,..堆栈跟踪 ?
我找不到我正在寻找的链接,但它类似于“编写有效的C”,但快速搜索未能找到它,它更基于C,但非常有帮助,并涵盖了错误和宏等内容。
看看ARX宏(转到定义),看看它们是如何完成繁重的工作的,基本上您用1个或多个关键字编写宏一次,这些关键字被替换为调用宏时使用的关键字,基本上预处理器用代码替换宏(这可能是很多行!)宏表示在它的位置上,这节省了大量的输入和可能的错误。
页:
[1]