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

C++ 寄存器c+的编译错误+;14和gcc,c++,c++14,gcc4.9,C++,C++14,Gcc4.9,下面是我使用GCC4.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 asm(“sp”); int main() { printf(“[%d]\n”,((无符号长)(sp)>=5)

下面是我使用GCC4.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 asm(“sp”);
int main()
{
printf(“[%d]\n”,((无符号长)(sp)>=5));
返回0;
}
我得到的错误是“预期的(sp)寄存器的显式地址”。但是,如果没有c++1y标志,我不会得到错误。我无法获得任何有关抑制此功能或显示此问题的c++14功能的标志的信息。请大家分享您的想法以解决这个问题。

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

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

此代码与
-std=c++14
一起工作:

#include <cstdio>

register unsigned long sp asm ("sp");
int main()
{
        std::printf("[%d] \n", (sp >= 5));
        return 0;
}
#包括
注册无符号长sp asm(“sp”);
int main()
{
标准::printf(“[%d]\n”,(sp>=5));
返回0;
}

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

请用您的标题描述问题。
register
只是一个提示,不推荐使用。在C++17中,它将被删除。不要使用它。@LightnessRacesinOrbit实际上,像这样使用的“寄存器”对您有特殊的意义。register关键字“notusing”表示不声明寄存器变量。当然,使用堆栈指针作为寄存器变量似乎是一个非常糟糕的主意。如果把它与常量进行比较,也就显得有些可疑。@ DavidWohlferd:如果这是GCC扩展,那么问题就不在C++语言上,应该更新以使其更清楚。特别是,在C++语言标准中没有答案。我无法解释为什么OP会用他所做的方式来标记问题。我将观察到,如果没有<代码> -STD+C++1Y编译器标志,他所描述的错误不会发生。我认为这是C++中的一个保留。C++中,声明“代码>登记器< /代码>的变量的语义应该与没有任何存储类说明符声明的变量完全不同。无论如何,造成这种情况的“标准的奇怪部分”是,我打赌,由
()
表达式触发的左值到右值的转换;asm(“movq%%rsp,%0”,“等于rm”(sp))(假定为x64)。尽管
-std=c++1y
这件事仍然使生成的代码难看(elizafox所指的指针)。也不确定为什么将堆栈指针与常量进行比较有意义。这只是发生编译错误的示例代码。在实际代码中没有使用带寄存器的堆栈变量/常量。我刚刚添加了只使用c++1y导致编译错误的代码。