错误 C2420:第一个操作数中有非法符号

Error C2420 : illegal symbol in first operand

我有这段代码,我正在使用 Visual Studio 2019。编译器给出错误: 错误 C2420 'less': 第一个操作数

中的符号非法
#include <iostream>
using namespace std;
int a, b, c, d, x;
int values[5]; // масив для збереження у(х)
void main() {
a = -6; b = 4; c = 8; d = 2;
__asm {
    mov eax, offset values
    push eax 
    mov cx, 5 
    start: 
        mov ax, 3 
        sub ax, cx 
        cwde 
        mov ebx, eax 
        mov eax, a 
        cmp ebx, 1 
        jl less // if х < 1, go to less
        je equals //if х == 1, go to equals

        // if х > 1:

        imul eax // a^2
        sub eax, ebx // a^2-x
        cdq 
        mov ebx, c 
        idiv ebx // (a^2-x)/c
        jmp result 

    less :
        mov edx, 2
        imul edx // a*2
        imul ebx // a*2*x
        add eax, 5 // a*2*x+5
        jmp result 
    equals :
        mov ebx, b 
        sub eax, ebx // a-b
        cdq 
        mov ebx, d 
        idiv ebx // (a-b)/d
        jmp result 
    result :
        pop ebx 
        mov[ebx], eax 
        add ebx, 4 
        push ebx 
        loop start 
}
for (int i = 0; i < 5; i++) {
    cout << values[i] << endl;
}
system("pause");
}

编译器由于这一行而出错:

jl less

没有它,代码就可以工作。但是我需要这条线,如何解决这个问题?

我修复了它,我需要对其他名称进行较少的更改(例如 less1))

您已通过以下行将整个 std 名称space 包含到本地名称space 中:

using namespace std;

问题在于 std 名称space 包含用于比较的函数对象(class 模板)std::less, std::greater_equal 等。

由于 std::less 已被拉入本地名称space,您使用的 MSVC 内联汇编代码被混淆,因为它认为您正试图 jmp 到标签 less 来自 std 名称 space 而不是内联汇编代码中的标签 less

正确的解决方法是删除这一行:

using namespace std;

包含整个 std 名称space 是不好的做法。删除上面的行将需要更改此行:

cout << values[i] << endl;

至:

std::cout << values[i] << std::endl;

或者您可以将 using namespace std; 替换为:

using std::cout;
using std::endl;

这只会将这两项包含到本地名称中 space。