bool BaseCheck(const CXXRecordDecl *BaseDefinition, void *BaseClassName) { // print warning about deriving from this classes // the name has to contain namespace, e.g. foo::bar::ClassName constchar *BaseClasses[] = { "Dialog", "ProgressBar", "SfxToolBoxControl", "StatusBar", 0,
}; for (int i = 0; BaseClasses[i]; i++) if (BaseDefinition->getQualifiedNameAsString().compare(BaseClasses[i]) == 0) {
*(constchar **)BaseClassName = BaseClasses[i]; returnfalse;
} returntrue;
}
bool DerivedClass::VisitCXXRecordDecl(CXXRecordDecl const * decl) { constchar *BaseClassName = 0; // checking for decl->hasDefinition() avoids crash in decl->forallBases if (decl->hasDefinition() && // not sure what hasAnyDependentBases() does, // but it avoids classes we don't want, e.g. WeakAggComponentImplHelper1
!decl->hasAnyDependentBases() &&
!decl->forallBases(BaseCheck, &BaseClassName)) {
string warning_msg("class %0 derives from "); // no idea how BaseClassName can be 0 sometimes... if (BaseClassName)
warning_msg += BaseClassName;
report(
DiagnosticsEngine::Warning,
warning_msg,
decl->getLocStart())
<< decl->getQualifiedNameAsString() << decl->getSourceRange();
} returntrue;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.