похоже, это скорее проблема C ++, чем проблема Clang …
Я должен использовать C ++ для того, чтобы написать правило OCLint (статический анализатор кода).
Я хочу сравнить два объекта из библиотеки Clang, которые имеют тип «SourceLocation».
Этот тип предоставляет информацию о местоположении (в основном линии & столбец) объекта (оператор, объявление и т. д.) в коде.
По сути, я хотел бы знать, начинается ли утверждение A и заканчивается ли оно до или после утверждения B.
В псевдокоде это означает, что я хотел бы получить логическое значение из:
(stmt_A-> getLocBegin () < Например, stmt_B-> getLocBegin ()). Конечно, это не компилируется, потому что<msgstr «оператор не определен между двумя объектами типа» SourceLocation «.
Я нашел метод в документации Clang, но, поскольку я не частый пользователь C ++, я не нахожу способ его использовать, вот этот метод:
http://clang.llvm.org/doxygen/classclang_1_1BeforeThanCompare_3_01SourceLocation_01_4.html
clang::BeforeThanCompare<SourceLocation>::BeforeThanCompare (SourceManager &SM)bool clang::BeforeThanCompare< SourceLocation >::operator()(SourceLocation LHS, SourceLocation RHS) const [inline]
Я не знаю, как использовать SourceManager или просто, как получить этот логический выше.
Вот заключительный код, который показывает, как использовать SourceManager в библиотеке Clang и как сравнить два SourceLocation:
// Declaration of a SourceManager
SourceManager & loc_SM = _carrier->getSourceManager();
// Declaration of an object BeforeThanCompare<SourceLocation>
BeforeThanCompare<SourceLocation> isBefore(loc_SM); SourceLocation stmt_A, stmt_B;
// Get whether stmt_A is before or after Stmt_B
bool A_before_B = isBefore(stmt_A,stmt_B);