1

我编写了一个脚本来检测我的 C++ 代码中的格式错误。(例如确保所有成员变量都以 为前缀m_)。我想做的一件事是确保作为指针的类型将星号附加到类型(int* num, not int *num)。

所以我需要获取源代码中的类型文本。然而,获取光标或类型的拼写会返回一个漂亮的打印版本,它总是会返回int *,即使源有int*.

为了解决这个问题,我获取了光标的范围并从源文件中获取子字符串并进行检查。但是似乎没有办法获得类型的范围,所以我无法获得它的实际拼写?有没有办法做到这一点?也许通过获取类型的标记然后获取这些标记?

(我正在使用 python 绑定,但如有必要可以切换到 C API)

4

2 回答 2

0

你可以试试这样的。获取拼写:

std::string symbol = clang_getCString(clang_getCursorSpelling(Cursor));

寻找一个指针声明器:

case CXType_Pointer:
{
  // ...
}

使用clang_tokenize,然后使用它来寻找*.

// Tokens retrieved with clang_tokenize
// symbol declared earlier
auto finder = std::find(tokens.begin(), tokens.end(), symbol);
if (*(finder) == "*")
{
  if (*(finder + 1)) == " ") { /* ... */ } // int* asdf
} else if (*(finder) == " ") {
  if (*(finder + 1)) == "*") { /* ... */ } // int *asdf 
}

当然这是伪代码。编译器未触及代码。

于 2016-05-16T00:55:24.910 回答
0

Libclang 是查找匹配(或不匹配模式)的成员变量的好工具,但是有一种更简单的方法可以解决代码库中漂亮的打印指针和引用的问题,那就是使用clang-format,它是用于格式化 C/C++/Java/JavaScript/Objective-C/Protobuf 代码的工具

Clang-format 有大量的选项,但最感兴趣的可能是PointerAlignment,它可以具有以下值之一:Left、Right 或 Middle,它们会适当地重新格式化指针(和引用)。

您可以从在线工具之一或内置样式生成 clang-format 的新配置文件:

clang-format -style=llvm -dump-config > .clang-format

编辑该文件以设置PointerAlignment为 Left 并运行:

clang-format main.cpp 

在“不良”格式的代码上,例如:

// main.cpp
int main()
{
    int a;
    int* b;
    int *c;
    int& d;
    int &d;
    int * e;
    const int * f;
    const int * const g;
    return 0;
}

我得到:

// main.cpp
int main() {
  int a;
  int* b;
  int* c;
  int& d;
  int& d;
  int* e;
  const int* f;
  const int* const g;
  return 0;
}

其他设置的结果类似。

如果您确实需要从代码中执行此操作,您可以使用libformat (支持 clang-format 的库),或者您可以使用subprocess调用 clang-format ,这就是 clang 代码库中的其他工具执行此操作的方式。

于 2016-05-17T09:32:15.957 回答