Clang++的InterlockedExchange的32位调用约定错误,但MSVC可以
Wrong 32-bit calling convention for InterlockedExchange for Clang++, but MSVC is fine
我正在使用clang powertools编译一个项目,该项目通常使用visualstudio编译
在boost的lwm_win32.hpp标头中(是的,我们使用的是旧版本的boost,目前无法更新(,我读取到一个错误。
这里声明的函数
stdcall
以前是在没有调用约定的情况下声明的
有问题的行是:
extern "C" __declspec(dllimport) long __stdcall InterlockedExchange(long volatile *, long);
在使用visualstudio编译时,我没有收到任何关于此行的错误或警告。有趣的是,即使我手动将调用约定从__stdcall
更改为__cdecl
,我也没有得到任何结果。Clang告诉我它以前看到过哪份声明。通过手动检查这个位置,我会说叮当是对的。在破译了所有预处理器定义之后,我还想说__cdecl
是visual studio应该看到的。然而,无论是InterlockedExchange的官方文档,还是内部的官方文档都没有提到特定的调用约定。
所以基本上我不确定问题的根源是什么。Visual studio接受声明中的任何调用约定?由于某些预处理器宏设置为错误的值,Clang没有看到正确的声明?Boost宣布了错误的呼叫约定?我必须承认我很困惑。
Visual Studio版本为2015更新3。
Clang++版本是6.0.0,使用参数-fms-compatibility-version=19
调用。
编辑
正如评论中所建议的那样,我查看了MSVC和Clang的预处理器输出。它们看起来和我完全一样。因为从助推到这两条线
extern "C" __declspec(dllimport) long __stdcall _InterlockedExchange(long volatile *, long);
两者都有
#pragma intrinsic(_InterlockedExchange)
和声明
long __cdecl _InterlockedExchange(long volatile * _Target, long _Value);
LONG __cdecl _InterlockedExchange(LONG volatile *Target, LONG Value);
以及用于不同重载的几个内联实现。
在这两个编译器中,我都以32位(-m32表示clang(为目标。
clang电动工具能为你提供你真的不想失去的东西吗?
如果没有(我想这是一个很大的假设(,那么你可以考虑尝试VS 2017对clang的支持。我个人没有这方面的经验,这一切仍然有点新鲜,但我所知道的是,MS正在投入大量工作,从长远来看可能会有回报。
事实上,我认为你可能有点不知所措。头文件中应该和不应该包含的内容,我会说MS所说的就是这样,不是吗?
你为什么要坚持使用旧版本的boost?这可能是一个阻碍问题。
- 我看到"use of undeclared identifier"错误,有人可以告诉我如何解决它吗?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么 std::绑定错误参数可以成功?
- Clion显示错误,但可以使用Cmake成功构建代码
- 我可以写入关闭的套接字并强制纠正损坏的管道错误吗?
- 任何人都可以弄清楚这段代码如何显示运行错误?它打印无限时间 -1 以及正确答案
- 访问我以前可以访问的功能时出现分段错误
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 任何人都可以查明我的递归函数中的错误吗?
- 使用Visual Studio 2012编译时,此代码会给我错误,但是使用代码块就可以了
- 哗啦��错误:无法识别任何一组可以驱动指定关节的控制器
- C++字符串到整数错误值可以反转吗?
- 我可以使用 try catch 语句来捕获任何错误而不是具体错误吗?
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 有没有一种方法可以让OpenCLC++绑定为所有错误抛出异常
- Clang++的InterlockedExchange的32位调用约定错误,但MSVC可以
- 为什么在这里使用 int64_t 错误和 int 可以编译?
- 为什么包含任意 STL 标头可以解决这些编译错误?
- 可以错误地使用赋值运算符而不是比较运算符的地方,= Vs ==
- 谁能想到一种方法,我可以错误地检查此问题