小编Asa*_*saf的帖子

如何在libclang c ++中使用RecursiveASTVisitor提取注释和匹配声明?

我正在编写一个实用程序,它应该解析C++(和C)头文件,提取结构,枚举,字段等,并根据提取的信息生成其他语言的代码.我决定使用libclang.

我正在使用a RecursiveASTVisitor,似乎我能够提取我需要的所有信息,除了评论.

我希望在每个声明(字段,结构,类,枚举)的上方出现注释,并在我用其他语言生成代码时添加其文本.

问题是我看到的所有使用注释的样本CxCursor和clang的C接口,我不知道如何CxCursor在我的上下文中获取.

那么 - 如何在仍然使用时提取注释RecursiveASTVisitor

c++ comments libclang

12
推荐指数
2
解决办法
2106
查看次数

它是Visual C++优化器错误还是我的代码中有错误?

我们正在从VS2013迁移到VS2017.

下面是一个可能不是那么简单的代码示例,但它是我能做的最好的.它的要点是一个特定的浮点值被发送到一个函数,但该函数接收到错误的值 - 这是因为调用函数中的寄存器不匹配.

此代码运行错误的VC141(VS 2017)和VC140(VS 2015年),但运行正常的VC120(VS 2013),并在其上已内置在VS 2017年(铛与微软的CodeGen(v141_clang_c2)铛版本-无论铛兼容它的版本).

在Release中编译x64平台时(使用优化)会出现问题.删除优化时,代码工作正常,所以我的猜测是优化器.badFunc()调用时出现了错误的行为test().

代码:

#include <iostream>
#include <vector>

struct FloatWrapper
{
    FloatWrapper() : m_value(0) {}
    explicit FloatWrapper(float value) : m_value(value) {}
    float getValue() const { return m_value; }

private:
    float m_value;
};

class Tester
{
public:

    virtual bool test(FloatWrapper elevation) const
    {
        std::cout << "Expected=" << m_expected.getValue() << ", received=" << elevation.getValue() << '\n';
        return elevation.getValue() == m_expected.getValue();
    }

    Tester(FloatWrapper expected) : m_expected(expected)
    {
    } …
Run Code Online (Sandbox Code Playgroud)

c++ visual-c++ compiler-bug visual-studio-2017

10
推荐指数
1
解决办法
844
查看次数

VC++仍然按顺序 - 一致吗?

我看了(大部分)Herb Sutter的atmoic <>武器视频,我想用样本中的循环来测试"条件锁定".显然,虽然(如果我理解正确的话)C++ 11标准说下面的例子应该正常工作并且顺序一致,但事实并非如此.

在您继续阅读之前,我的问题是:这是正确的吗?编译器坏了吗?我的代码是否被破坏 - 我在这里遇到了一个我错过的竞争条件吗?我该如何绕过这个?

我尝试了3种不同版本的Visual C++:VC10专业版,VC11专业版和VC12 Express版(== Visual Studio 2013 Desktop Express).

下面是我用于Visual Studio 2013的代码.对于其他版本,我使用boost而不是std,但想法是一样的.

#include <iostream>
#include <thread>
#include <mutex>

int a = 0;
std::mutex m;

void other()
{
    std::lock_guard<std::mutex> l(m);
    std::this_thread::sleep_for(std::chrono::milliseconds(2));
    a = 999999;
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::cout << a << "\n";
}

int main(int argc, char* argv[])
{
    bool work = (argc > 1);

    if (work)
    {
        m.lock();
    }

    std::thread th(other);
    for (int i = 0; i < 100000000; ++i)
    {
        if (i % …
Run Code Online (Sandbox Code Playgroud)

c++ concurrency multithreading compiler-optimization visual-c++

9
推荐指数
1
解决办法
1047
查看次数

如何以编程方式阻止Vista(和Windows 7)中的"程序兼容性助手"出现?

我开发了一个可能使用adobe flash的C++程序,尽管它不是必需的.
我使用CoCreateInstance创建flash对象,如果失败,我知道flash没有安装,所以我不使用它.
但是,在Vista(我也认为是Windows 7)中,当没有安装flash时,在离开应用程序后,"程序兼容性助手"弹出一条消息,指出"此程序需要缺少Windows组件"指定闪存. OCX.

有没有办法阻止此消息出现?我不想强迫任何用户安装闪存(特别是因为它是IE ActiveX,而FireFox用户可能没有安装它),并且我的应用程序可以在没有闪存的情况下正常运行.
另外,这个消息在每次运行后出现时都非常烦人.
我当然不是要在用户的计算机上禁用PCA,而是在所有计算机上以编程方式禁用此特定外观.

有什么想法吗?
谢谢

[编辑:]

我跟随Shay的领导(谢谢),并做了一些我自己的挖掘.我将以下XML添加到应用程序的清单中:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
  <security>
    <requestedPrivileges>
      <requestedExecutionLevel level="asInvoker" uiAccess="false">
      </requestedExecutionLevel>
   </requestedPrivileges>
  </security>
</trustInfo>
Run Code Online (Sandbox Code Playgroud)

(另请参阅:msdn.microsoft.com/en-us/library/bb756929.aspx)
这解决了Vista 64上的问题.

为解决Windows 7上的同样问题,我添加了以下内容:

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
  <application>
    <!--The ID below indicates application support for Windows Vista -->
    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
    <!--The ID below indicates application support for Windows 7 -->
    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
  </application>
</compatibility>
Run Code Online (Sandbox Code Playgroud)

(另见:blogs.msdn.com/yvesdolc/archive/2009/09/22/the-new-compatibility-section-in-the-application-manifest.aspx)

解决了Windows 7.

但由于某种原因,它仍然发生在Vista 32 ...

我也尝试编辑导致问题的特定DLL的清单,但它没有任何效果.只有可执行文件的清单本身才会影响问题.

所以...... Vista 32?

com flash winapi compatibility windows-vista

6
推荐指数
1
解决办法
4295
查看次数

SQL Server 连接字符串关键字区分大小写,尽管它们不应该区分大小写

我使用 .NET 的 OdbcConnectionStringBuilder 来更新从配置文件读取的连接字符串,这使其键小写,如 MS 所记录(“数据源”->“数据源”)。

连接字符串用于访问 MS SQL Server(2008,如果有区别的话)。

它在我的机器(Windows 7 32 位)上运行良好,根据MS 的文档,它应该可以运行:

关键字不区分大小写

然而,在其他几台机器上(至少有一些是64位的),无法使用这个小写字母打开与DB的连接。只有在手动将关键字更改为其原始大小写(每个单词的字母大写)后,数据库连接才会打开。

连接字符串中的关键字(全部修改为小写):

  • Data Source
  • Initial Catalog
  • Integrated Security

.net sql-server connection-string case-sensitive keyword

6
推荐指数
1
解决办法
6900
查看次数

VC++ 2010 - 向解决方案中的单个项目添加配置无法构建

我有以下情况:

我有一个约20个C++项目的解决方案.大多数是静态库,一些是DLL和一些可执行文件.该解决方案有两个配置 - Debug和Release,以及两个平台 - Win32和x64.一直以来都很好.

现在我想为特定的静态库(lib_core) - X和Y提供两种不同的行为.所以我#ifdef在这个库代码中添加了一些宏USE_X.我基于"Release"创建了一个新的解决方案配置"Release_X",并将"Release"重命名为"Release_Y".

然后,我对lib_core的项目配置执行了相同的操作,将相关的项目配置分配给相同的解决方案配置,并将宏添加USE_X到Release_X项目配置中.

所有其他项目(其中一些甚至不是我的,所以我无论如何都无法改变它们)保留了Release和Debug配置.

现在,当我尝试构建项目时(以及清理/重建,以防万一) - lib_core无法构建:

2>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(283,5): 
error MSB8013: This project doesn't contain the Configuration and Platform combination of Release|Win32.
Run Code Online (Sandbox Code Playgroud)

这里有什么问题?

我怎样才能做到这一点?

projects-and-solutions visual-studio-2010 visual-c++

6
推荐指数
1
解决办法
6330
查看次数

VC++使用fp:fast导致错误(不仅仅是不准确)结果 - 这是编译器错误吗?

我安装了最新的VS2017更新(15.4.4),在编译项目时,单元测试开始失败.在使用优化(/ O2)和浮点快速模型(/ fp:fast)时,似乎在某些情况下会出现问题.以前的编译器(VS2017更新15.2)没有发生此问题.

这是一个示例程序:

#include <iostream>

const float FACTOR = 0.01745329251994329576923690768489f;

unsigned long long hoursToMicrosecs(int hours)
{
    return hours * 3600 * 1000000LL;
}

float degToRad(float deg)
{
    return deg * FACTOR;
}

float f(int u1, int u2)
{
    float percent = ((u1 - u2) / 1000.0f) / (hoursToMicrosecs(24) / 1000000.0f);
    return degToRad(percent * 360);
}

int main()
{   
    auto result = f(3600000, 35063681);
    std::cout << result << '\n';
    return (result > -3.0f) ? 0 : -1;
}
Run Code Online (Sandbox Code Playgroud)

result 应该是-2.2881,但输出实际上是-394.868,这不仅是不准确的. …

c++ floating-point visual-c++ compiler-bug visual-studio-2017

6
推荐指数
1
解决办法
508
查看次数

如何检测视图矩阵是左撇子还是右撇子?

我有一个从GL程序收到的相机视图矩阵。我知道这个矩阵是右撇子,因为这是GL的工作方式,但是我如何检查该矩阵是右撇子还是编程左撇子呢?

对于投影矩阵,我检查matrix [3] [4](行专业)是否为正,以查看是否为左手。它是否正确?

谢谢。

编辑

我已经尝试过行列式解决方案,但不幸的是,这不是真的(至少根据我的实验):

我已经使用DX9数学函数对其进行了测试(以避免代码中可能出现的错误)。我已经运行了以下代码:

 D3DXVECTOR3 vEye(0,0,0);
 D3DXVECTOR3 vTarget(6,3,0);
 D3DXVECTOR3 vUp(0,0,1);

 D3DXMATRIX matViewLH;
 D3DXMATRIX matViewRH;

 D3DXMatrixLookAtLH(&matViewLH, &vEye, &vTarget, &vUp);
 D3DXMatrixLookAtRH(&matViewRH, &vEye, &vTarget, &vUp);

 float fLHDet = D3DXMatrixDeterminant(&matViewLH);
 float fRHDet = D3DXMatrixDeterminant(&matViewRH);
Run Code Online (Sandbox Code Playgroud)

并且两个行列式相等(都等于0.99999994),并且显然具有相同的符号。

关于我的问题-由于我同时获得了视图矩阵和投影矩阵,并且测试投影矩阵是LH还是RH相对容易-我使用此信息来标识坐标系。

opengl graphics matrix

5
推荐指数
1
解决办法
2348
查看次数

无论模板参数如何,哪些std :: map方法都相同(并且可能共享符号)?

我有一个崩溃转储,我正在尝试分析(VC++ 2010).

然后我有一个看起来像这样的callstack(为了便于阅读,我在这里修剪了很多):

myapp.exe!std::_Tree<std::_Tmap_traits<unsigned int,StructB,std::less<unsigned int> ... >::_Erase(...)
myapp.exe!std::_Tree<std::_Tmap_traits<unsigned int,StructA,std::less<unsigned int>,... >::clear() 
Run Code Online (Sandbox Code Playgroud)

(clear()调用_Erase())

请注意值的模板参数(StructA与StructB)之间的差异.现在,我知道具有完全相同二进制文件的不同方法可以在PDB中具有相同的符号,即使它们实际上使用不同的代码.我假设这是这里的情况(std :: map :: _ Erase是相同的,无论值类型).

但我怎么知道呢?是否有适用的stl方法列表(对于此MS实现)?这可能是某种错误吗?

更新:

查看PDB(在文本编辑器中),我看到很多std :: map <...> :: _ Erase,特别是我看到它们同时用于StructA和StructB.我不知道它是否意味着折叠.

另外,std :: map的反汇编代码显示了对地址的调用,该地址被解释为std :: map.我想这意味着代码折叠......

c++ stl visual-studio-2010 debug-symbols visual-c++

5
推荐指数
1
解决办法
150
查看次数

C#打开虚拟串行端口会引发ArgumentException

我有一个通过串行端口连接到设备的实用程序。为了测试该应用程序,我正在为设备编写一个模拟器。

这两个应用程序都打算在同一Windows 7计算机上运行。

我正在用C#编写模拟器。我使用com0com创建了一对虚拟端口(在本例中为CNCA8和CNCB8,因为我已经有几个现有的端口对)。

我正在尝试在模拟器中打开CNCB8(应用程序尚未运行),但出现异常:

System.dll中发生了'System.ArgumentException'类型的未处理异常

附加信息:给定的端口名不能以COM / com开头或不能解析为有效的串行端口。

样例代码:

        SerialPort port = new SerialPort("CNCB8", 9600, Parity.None, 8, StopBits.One);
        port.Handshake = Handshake.None;            
        port.Open();
Run Code Online (Sandbox Code Playgroud)

此问题无关紧要,因为它是未使用的虚拟端口(如果重要,IsOpen将返回false): C#SerialPort#Open()方法由于端口名称而抛出ArgumentException?

编辑:我还确保端口名称出现在SerialPort.GetPortNames()中,并且它出现在Windows的“ com0com串行端口仿真器”下的设备管理器中。我还尝试使用CNCA代替B(具有几个现有的虚拟端口),尝试删除“ HandShake”行,并尝试将波特率更改为115200,以防万一(尽管最终我在那里需要9600)。

c# windows serial-port virtual-serial-port com0com

5
推荐指数
1
解决办法
2527
查看次数