寄存器c++14和gcc的编译错误

compilation error with registers, c++14 and gcc

本文关键字:编译 错误 gcc c++14 寄存器      更新时间:2023-10-16

下面是我用gcc 4.9编译的代码,带有标志-std=c++1y:

#include <stdio.h>
register unsigned long sp asm ("sp");
int main()
{
    printf("[%d] n",((unsigned long)(sp) >= 5));
    return 0;
}

我得到的错误是"寄存器"(sp)"的预期显式地址"。但是,如果没有c++1y标志,我就不会得到错误。我无法获得任何关于抑制此问题的标志或显示此问题的c++14功能的信息。请任何人分享你的想法来解决这个问题。

出于某种原因(我不知道为什么),在sp周围放括号会导致GCC认为您想要变量的地址(这对于寄存器变量来说是不可能的),这对我来说似乎是一个bug,但可能是由于标准的某些奇怪部分而导致的某种故意行为。

您也不需要对变量进行强制转换。

此代码适用于-std=c++14:

#include <cstdio>
register unsigned long sp asm ("sp");
int main()
{
        std::printf("[%d] n", (sp >= 5));
        return 0;
}

它将在我的机器上打印1(因为你打印的是真值)。