const uint8_t * const val;
int num = 5;
const bool res = (val && (num>0));
在这里,我需要将const uint8_t* const
类型的指针转换为bool
。
我该怎么做/应该这样做?
答案 0 :(得分:2)
问题在于:
const uint8_t * const val;
它指向const
的{{1}}指针,因此要么必须指向某个有效内存,通常是const uint8_t
变量/值,要么摆脱{{1} }}岬。
启用警告后,编译器会在此语句中生成警告:
const
因为const
尚未初始化。在您的情况下,编译器在这里抱怨,因为它是未定义的行为。但是,我得到的问题不是关于为什么或如何处理未定义的行为,所以不要深入研究。
请参阅以下代码:
const bool res = (val && (num>0));
输出:
val
符合预期:#include<stdio.h>
typedef unsigned char uint8_t; // There are better ways of doing it, but I am lazy right now
typedef enum { TRUE = 1, FALSE = 0 } Bool_t; // There are better ways of doing it, but I am lazy right now
int main() {
const uint8_t ch = 'A'; //0x41
// Below initialization/assignment is what you missed.
const uint8_t * const val = &ch;
int num = 5;
const Bool_t res = *val + num;
//The above assignment is not suited in terms of accuracy because,
//`res` is type `Bool_t`, so it *should* ideally be assigned
//with values either TRUE or FALSE, but anyways, here we go.
printf("0x%x", res);
}
+ 0x46
为'A'
。
注意:您始终可以养成在启用所有警告的情况下编译代码的习惯。花些时间阅读this rich documentation。到那时,0x05
或更好0x46
是您所需要的。
答案 1 :(得分:1)
如果您在启用警告的情况下编译代码,您将获得:
warning: 'val' is used uninitialized in this function [-Wuninitialized]
const bool res = (val && (num>0));
~~~~~^~~~~~~~~~~
这是因为你声明了你的指针,但你没有初始化它,在这里:
const uint8_t * const val;
将其初始化为一个值,例如:
uint8_t v = 5; // example value
const uint8_t * const val = &v;
如何将
const uint8_t * const
转换为bool
?
无论你有const
个关键词,都需要关注你有一个指针。
所有指针都隐式可转换为布尔值(因此bool
也是如此),这意味着您不必再做更多事情,您的代码应该可以解决问题(现在您已初始化val
)。