![](/img/trans.png)
[英]Is it possible to use explicit register variables in GCC with C++17?
[英]GCC- Invalid use of Register
我正在为VS2012编译一个项目,为Windows编译GCC(CodeBlocks)。 在VS2012上一切都很完美。 在GCC下我得到以下编译错误:
C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|164|Error: invalid use of register|
C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|166|Error: invalid use of register|
C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|221|Error: invalid use of register|
||=== Build finished: 3 errors, 14 warnings (0 minutes, 0 seconds) ===|
我正在使用编译器选项-fpermissive - 它应该与错误无关。
我只是无法理解为什么它指向Local Temp文件夹下的临时文件,并说我使用了错误的寄存器?
有没有人知道发生了什么?
看起来您在编译器中遇到了一个错误。 错误消息(从“源”文件名判断)来自汇编程序。 汇编程序生成错误消息的唯一时间是汇编程序中存在非法内容,并且C ++编译器永远不应生成非法汇编程序; 如果它不能生成合法的汇编程序,它应该输出错误信息并失败。
当您收到此类消息时,真正的问题是要弄清楚代码中触发它的内容。 g ++有一个选项,告诉它不要删除任何中间文件。 使用它,然后尝试查看这些行的assember文件中发生了什么。 (当你要求g ++输出汇编程序时,它会提供很好的注释以帮助查找相应的源。我不知道在将汇编程序生成为中间文件时是否也会这样做。)然后尝试切割代码(如果更糟的是更糟糕的是,使用二进制搜索)直到你可以得到一行或两行程序的错误。 试着猜出它们的特殊之处,并以不同的方式改变它们以做同样的事情。
并且不要将错误报告给g ++。
感谢James Kanze的建议,我决定告诉编译器不要删除临时文件。 这是由旗帜完成的:
- 保存 - 临时工
正如James所说,汇编程序会生成一些很好的注释,这些注释可以准确地告知我们的C ++代码中的哪一行引发了错误。 就我而言,看起来它不接受这样的指示:
asm
(
".intel_syntax noprefix\n"
"lock dec [DWORD PTR eax]\n"
".att_syntax \n"
:
: "a" (data)
:
);
我不知道他为什么不再接受英特尔语法,因为它正在使用以前的GCC版本,现在我更新了它不再了。
无论如何,这些问题的解决方案是詹姆斯提到的问题:只是不要删除中间文件,以便你可以直接监视汇编代码有什么问题。
关于INTEL语法的问题,任何想法为什么它不再起作用?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.