c - 如何初始化 GNU C 全局寄存器变量
问题描述
GNU C 全局寄存器变量不能有初始值设定项。这不会编译为 C 或 C++:
// at global scope.
register int i asm ("r12") = 10;
给(上帝螺栓)error: global register variable has initial value
。本地范围当然没问题,但 GNU C本地寄存器变量是完全不同的东西。asm()
(仅保证在与扩展语句的交互方面做任何事情。)
代码
#include<stdio.h>
register int i asm ("r12"); //how to initialize i here?
int main()
{
i=10; // Would rather avoid this workaround
printf("%d\n",i);
}
如何i
在全局范围内初始化,而不是等到 main 的顶部?
解决方案
您无法初始化全局寄存器变量。
GCC 文档说明了这一点:
全局寄存器变量不能有初始值,因为可执行文件无法为寄存器提供初始内容。
另请注意以下段落:
选择寄存器时,请选择通常由机器上的函数调用保存和恢复的寄存器。这确保了不知道此保留的代码(例如库例程)将在返回之前将其恢复。
您不应该使用r12
,它不会跨调用保存。
推荐阅读
- sql - 无法在字符集之间音译字符
- expo - ActionBar上的Vue Native“元素类型无效:预期为字符串”
- wpf - 为什么我的单行和多行按钮都被禁用时看起来不同?
- python-2.7 - 找到大于或等于 n 的 k 的最小重数
- android - Recyclerview中的行位置错误地改变了背景颜色
- c++ - 如何为 C++ RTP 应用程序项目配置 SonarQube 开发版
- c - 如何在 C 编程中计算整数的长度?
- c - 任何人都可以在 PCRE2 中包含 JIT 功能吗?
- python - 使用对象检测 API 训练 Faster-RCNN 和 Densenet
- c++ - 为什么 Boost atomic 示例中的无等待多生产者队列是无等待的