MickD 发表于 2009-4-3 12:31:08

错误消息的宏

有人使用宏来让检查函数状态变得更容易吗?
如果是这样,你有一个很酷的分享吗?

#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 *****

MickD 发表于 2009-4-3 13:33:49


不是我......

MickD 发表于 2009-4-3 21:55:25

看起来很整洁,我会用这些派对一会儿,看看它是如何工作的
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__));}

MickD 发表于 2009-4-3 22:27:45


我见过它们,但到目前为止还不需要它们
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;

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

MickD 发表于 2009-4-3 22:36:12

我想对于大多数人来说,只返回错误状态是可以的,但是对于像我这样的新手来说,我需要指向问题发生的代码中的确切行。我想我可以使用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;
}

MickD 发表于 2009-4-3 22:39:40

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

MickD 发表于 2009-4-3 22:40:10

宏看起来很丑....我简单地结束使用这样的东西,例如:
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);
}

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

MickD 发表于 2009-4-3 22:40:45

最近我开始做一些事情,比如代码7]

MickD 发表于 2009-4-3 22:45:58

这样做的一个副作用是多个错误消息,..堆栈跟踪 ?

MickD 发表于 2009-4-3 23:01:59

我找不到我正在寻找的链接,但它类似于“编写有效的C”,但快速搜索未能找到它,它更基于C,但非常有帮助,并涵盖了错误和宏等内容。
看看ARX宏(转到定义),看看它们是如何完成繁重的工作的,基本上您用1个或多个关键字编写宏一次,这些关键字被替换为调用宏时使用的关键字,基本上预处理器用代码替换宏(这可能是很多行!)宏表示在它的位置上,这节省了大量的输入和可能的错误。
页: [1]
查看完整版本: 错误消息的宏