是否可以通过clang与现有的libclang API解析C++与不完整的声明?即解析.cpp文件,不包括所有标题,动态推断声明.所以,例如以下文字:
A B::Foo(){return stuff();}
Run Code Online (Sandbox Code Playgroud)
将检测未知符号A,使用我的魔法启发式调用我的回调来减去A是一个类,然后用B和Foo和东西以相同的方式调用此回调.最后我希望能够推断出我看到B级的成员Foo返回A,而东西是一个函数..或者是那种效果.上下文:我想看看我是否可以进行合理的语法突出显示和即时代码分析,而无需快速解析所有头文件.
[编辑]为了澄清,我正在寻找非常严格限制的C++解析,可能有一些启发式来解除一些限制.
C++语法充满了上下文依赖性.Foo()是函数调用还是Foo类的临时构造?是Foo <Bar>的东西; 模板Foo <Bar>实例化和变量东西的声明,还是看起来很奇怪2调用重载的运算符<和运算符>?它只能在上下文中讲述,而上下文通常来自解析头文件.
我正在寻找的是一种插入我的自定义约定规则的方法.例如,我知道我没有重载Win32符号,所以我可以安全地假设CreateFile 始终是一个函数,我甚至知道它的签名.我也知道我的所有课程都以大写字母开头,都是名词,函数通常是动词,所以我可以合理地猜测Foo和Bar是类名.在一个更复杂的场景中,我知道我不会像<b> c那样编写无副作用的表达式; 所以我可以假设a始终是模板实例化.等等.
所以,问题是每次遇到未知符号时是否可以使用Clang API回调,并使用我自己的非C++启发式给它一个答案.如果我的启发式失败,那么解析就会失败.我不是在谈论解析Boost库:)我说的是非常简单的C++,可能没有模板,仅限于clang在这种情况下可以处理的最小值.
我有2个进程(A,B)共享相同的互斥锁(使用WaitForSingleObject/ReleaseMutex调用).一切正常,但当进程A崩溃时,进程B正在快乐地哼唱.当我重新启动进程A时,会出现死锁.
更深入的调查显示,在进程A崩溃后,进程B可以成功调用ReleaseMutex()两次.
我的解释:在进程A崩溃后,互斥锁仍然被锁定,但是互斥锁的所有权很容易转移到进程B(这是一个错误).这就是为什么它快乐地哼着,调用WaitForSingleObject(得到WAIT_OBJECT_0)和ReleaseMutex(得到TRUE作为回报).
是否可以使用类似于Mutex的命名同步原语,以便进程A中的崩溃将释放互斥锁?
一种解决方案是使用SEH并捕获崩溃并释放互斥锁,但我真的希望Windows有一个健壮的原语,它不会像进程崩溃那样死锁.
我想实现一个小部件(带有一些编辑框和滑块),当我将其悬停时,该小部件将在按钮(“Opener”)下方或旁边打开。关键是它是一个临时小部件 - 一旦它失去焦点,我希望它消失。另外,我希望它就在 Opener 旁边弹出,最好将箭头指向 Opener。
所以,它基本上是一个工具提示。但它需要是一个带有按钮和滑块之类的小部件。有没有一种聪明的方法来实现它,而无需制作自定义小部件并为所有鼠标和焦点事件编写处理程序,并在每次打开它或 Opener 移动时重新计算其理想位置?