Clang++的InterlockedExchange的32位调用约定错误,但MSVC可以

Wrong 32-bit calling convention for InterlockedExchange for Clang++, but MSVC is fine

本文关键字:可以 错误 MSVC 约定 InterlockedExchange 32位 调用 Clang++      更新时间:2023-10-16

我正在使用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?这可能是一个阻碍问题。

相关文章: