此处不允许使用 'asm' 声明

An 'asm' declaration is not allowed here

所以我这里有这段代码,它不允许我编译我的 dll,它只是 returns 上面的错误。

void Math::AngleVectors(const Vector &angles, Vector *forward, Vector *right, Vector *up)
{
    auto SinCos = [](float flRadians, float* pflSine, float* pflCosine)
    {

        __asm
        {
            fld DWORD PTR[flRadians]
            fsincos
            mov edx, DWORD PTR[pflCosine]
            mov eax, DWORD PTR[pflSine]
            fstp DWORD PTR[edx]
            fstp DWORD PTR[eax]
        } // here it says the error "an 'asm' declaration is not allowed here"
    };
[...]
}

我不知道如何解决这个问题,有人知道这里出了什么问题吗?

我的目标是 x86

不幸的是,您不能做您想做的事。出于安全考虑,在 Visual Studio 2019 年的 lambda 中不支持内联汇编:

https://docs.microsoft.com/en-us/cpp/overview/cpp-conformance-improvements?view=msvc-160#inline-assembly-code-isnt-supported-in-a-lambda-expression

解释答案(很详细),您必须将 asm 放在命名函数中并让 lambda 调用:


void SinCosAsm(float flRadians, float* pflSine, float* pflCosine) {
    __asm
    {
        fld DWORD PTR[flRadians]
        fsincos
        mov edx, DWORD PTR[pflCosine]
        mov eax, DWORD PTR[pflSine]
        fstp DWORD PTR[edx]
        fstp DWORD PTR[eax]
    }
    //...
}

void Math::AngleVectors(const Vector &angles, Vector *forward, Vector *right, Vector *up)
{
    auto SinCos = [](float flRadians, float* pflSine, float* pflCosine)
    {
        SinCosAsm(flRadians, pflSine, pflCosine);
    };
[...]
}