我正在编写一些将虚拟地址映射到物理地址的代码。
我有以下几行代码:
if (address > 0xFFFF)
Status = XST_FAILURE; // Out of range
else if (address <= 0xCFFF || address >= 0xD400) {
// Write to OCM
Xil_Out8(OCM_HIGH64_BASEADDR + OCM_OFFSET + address, data);
else { // (address >= 0xD000)
// Write to external CCA
Status = ext_mem_write(address, data);
Run Code Online (Sandbox Code Playgroud)
我收到编译器警告:
comparison between pointer and integer [enabled by default]
我意识到我正在比较两种不同的类型(指针和整数),但这是一个问题吗?毕竟,将指针与整数进行比较正是我想要做的。
定义要比较的指针常量而不是整数会更清晰吗?
const int *UPPER_LIMIT = 0xFFFF;
...
if (address > UPPER_LIMIT ){
....
Run Code Online (Sandbox Code Playgroud)
干净的方法是使用类型的常量uintptr_t,它被定义为一个无符号整数,可以在指针和整数之间唯一映射。
这应该由 定义#include <stdint.h>。如果未定义,则表明您的编译器不遵循 C 标准,或者系统没有平面内存模型。
它旨在以“明显”的方式映射,即每个字节一个整数,按升序排列。该标准并不能绝对保证这一点,但作为实施质量问题,很难看到其他情况发生。
例子:
uintptr_t foo = 0xFFFF;
void test(char *ptr)
{
if ( (uintptr_t)ptr < foo )
// do something...
}
Run Code Online (Sandbox Code Playgroud)
C 标准对此进行了明确定义。您使用的版本void *是uintptr_t未定义的行为,尽管如果您的编译器不太激进,它可能看起来可以工作。