为什么使用类型化的 8 位常量而不是等效的 #define "Impossible constraint"?
Why "Impossible constraint" with a typed 8-bit constant but not with an equivalent #define?
我收到一条错误消息,使用一个 8 位类型常量,我在 AVR 8 位微控制器(如 ATtiny1634 或 ATmega328(的内联汇编代码中用约束"M"
标记该常量:
static const uint8_t tail_mask = (uint8_t)((rx1::queue_length-1) <<
rx1::queue_length_bits) & 0xFF;
asm(
...
"andi r30, %0nt"
...
:
: "M" (tail_mask)
);
警告:ASM 操作数 1 可能与约束不匹配
这里rx1
是一个类名,queue_length
和queue_length_bits
都是static const uint8_t
类常量。我可以使用"O"
,"N"
,没办法。使用static
,int8_t
与否没有区别。
如果我用#define
替换上面的static const uint8_t
定义,错误消息就会消失!
#define tail_mask ((rx1::queue_length-1) << rx1::queue_length_bits)
asm(
...
"andi r30, %0nt"
...
:
: "M" (tail_mask)
);
编译很好!
这让我很烦恼。为什么使用强制的 8 位无符号常量会在强制约束上产生错误消息,强制它...一个 8 位无符号常量?
作为记录,我使用的是avr-gcc
版本7.1.0。
传递给约束的值在这里可能应该是 32 位整数。这是您在使用 #define 时获得的,因为它以静默方式提升为预期类型。同样,使用 int 或 unsigned 作为您的tail_mask值也是可以的。奇怪的是,我浏览了文档的几个版本,但没有发现任何证据表明 M 约束参数不能是uint8_t或类似参数。
相关文章:
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 如何以静态代码分析友好的方式使用 #define 防护?
- C++相当于整数的 #define
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 找不到 #define 的函数定义
- "#define X X"是什么意思?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- c中 #define 的不足
- 使用 [#define & #ifdef] 跨文件激活代码块
- 如何避免#define语法的变量重新声明
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 使用 #define 声明函数
- #define 宏中的括号失败
- 为什么使用类型化的 8 位常量而不是等效的 #define "Impossible constraint"?