gpt4 book ai didi

c++ - InterlockedExchange for Clang++ 的 32 位调用约定错误,但 MSVC 没问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:40:42 27 4
gpt4 key购买 nike

我正在使用 clang power tools编译一个通常使用visual studio编译的项目。
boost's lwm_win32.hpp header (是的,我们使用的是旧版本的 boost,目前无法更新)读取时出错。

function declared stdcall here was previously declared without calling convention

有问题的行是:

extern "C" __declspec(dllimport) long __stdcall InterlockedExchange(long volatile *, long);

在使用 visual studio 编译时,我没有收到关于此行的任何错误或警告。有趣的是,即使我手动将调用约定从 __stdcall 更改为 __cdecl,我也没有得到任何结果。Clang 告诉我它看到了哪个先前的声明。通过手动检查这个位置,我会说 clang 是正确的。在破译所有预处理器定义之后,我还要说 __cdecl 是 visual studio 应该看到的。然而,official documentation for InterlockedExchange 都不是,也不是 official documentation for the intrinsic请务必提及特定的调用约定。

所以基本上我不确定问题的根源是什么。 Visual Studio 在声明中接受任何调用约定?由于某些预处理器宏设置为错误的值,Clang 没有看到正确的声明? Boost 声明了错误的调用约定?我必须承认我很困惑。

Visual Studio 版本为 2015 Update 3。

Clang++ 版本为 6.0.0,使用参数 -fms-compatibility-version=19 调用。

编辑

正如评论中所建议的,我查看了 MSVC 和 Clang 的预处理器输出。他们看起来很像我。对于从 boost 扩展到

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 for clang)。

最佳答案

clang 电动工具是否为您提供了您真正不想没有的东西?

如果不是(我认为这是一个很大的假设),那么您可能会考虑尝试使用 VS 2017 对 clang 的支持。我个人没有这方面的经验,它仍然有点新,但我所知道的是 MS 正在投入大量工作,从长远来看,它可能会得到返回。

实际上,我认为您可能有点不知所措。无论头文件中应该和不应该包含什么,我会说 MS 说的是什么,不是吗?

您为什么坚持使用旧版本的 boost?这可能是这里的一个阻塞问题。

关于c++ - InterlockedExchange for Clang++ 的 32 位调用约定错误,但 MSVC 没问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51320890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com