c++ - 如何使用 C API 而不是实际知道 Clang 的书面 var 类型?

标签 c++ c clang

我正在尝试通过 C API 使用 Clang,详细索引。问题是某些类型不是按编写的那样返回,而是按编译器返回。例如“Stream &”变成“int &”,“byte”变成“int”。

一些测试库:

// TODO make it a subclass of a generic Serial/Stream base class
class FirmataClass
{
public:
    FirmataClass(Stream &s);

    void setFirmwareNameAndVersion(const char *name, byte major, byte minor);

我正在使用代码获取方法信息:

void showMethodInfo(const CXIdxDeclInfo *info) {
    int numArgs = clang_Cursor_getNumArguments(info->cursor);
    fprintf(stderr, "  %i args:\n", numArgs);

    for (int i=0; i<numArgs; i++) {
        CXCursor argCursor = clang_Cursor_getArgument(info->cursor, i);
        CXString name = clang_getCursorDisplayName(argCursor);
        CXString spelling = clang_getCursorSpelling(argCursor);

        CXType type = clang_getCursorType(argCursor);
        CXString typeSpelling = clang_getTypeSpelling(type);

        CXCursorKind kind = clang_getCursorKind(argCursor);

        fprintf(stderr, "  kind=[%s (%i)], type=[%s], spelling=[%s]\n",
            cursor_kinds[kind], kind, clang_getCString(typeSpelling),
            clang_getCString(spelling));

        clang_disposeString(name);
        clang_disposeString(spelling);
        clang_disposeString(typeSpelling);
    }

    // return type
    CXType returnType = clang_getCursorResultType(info->cursor);
    CXString returnTypeSpelling = clang_getTypeSpelling(returnType);

    fprintf(stderr, " returns %s\n", clang_getCString(returnTypeSpelling));
    clang_disposeString(returnTypeSpelling);
}

输出:

[105:10 4689] access=[CX_CXXPublic] kind=[CXIdxEntity_CXXInstanceMethod] (21) name=[setFirmwareNameAndVersion] is_container=[0] 3 args:
kind=[CXCursor_ParmDecl (10)], type=[const char *], spelling=[name]
kind=[CXCursor_ParmDecl (10)], type=[int], spelling=[major]
kind=[CXCursor_ParmDecl (10)], type=[int], spelling=[minor] returns void

所以你可以看到 byte 函数参数被描述为 int。 我怎样才能得到实际的拼写?

最佳答案

byte 是通过 typedef 还是 #define 声明的?

当我声明这些类型时:

typedef int MyType_t;
#define MyType2_t int

class Foo
{
public:
    bool bar( MyType_t a, MyType2_t b );
};

然后打印我从 clang_GetTypeSpelling 得到的类型名称,这就是我得到的:

bool Foo_bar(  MyType_t a, int b )

Libclang 可能无法打印 #defined 名称,因为在构建解析树时预处理器已经将其替换为 int

关于c++ - 如何使用 C API 而不是实际知道 Clang 的书面 var 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19906033/

相关文章:

c++ - 如何在 Windows 上编译 Clang

c++ - CMake 包含第 3 方项目

c++ - C++ 多态性中的访问冲突(虚拟指针函数指向错误的位置?)

c - C 中类似 Haskell 的类型系统

clang - clang :将除…之外的所有警告均提升为错误

c - 在 Mac 上的 Homebrew 安装的 Vim 中添加 clang 完成

c++ - 从这个文本文件中读入和分离信息的好方法是什么?

c++ - 在 C++ 中使用寄存器变量可以做多少坏事

c - 类似 Printf 的函数,具有可选格式字符串参数和 GCC 格式类型检查

无法达到 dd 的速度