这种变量声明是什么意思?
What's the meaning of this kind of variable declaration?
我看到一种我无法理解的使用C声明变量的方法
(因为它只是整个嵌入式系统程序中的一小部分,所以我在下面尝试更简单地重现它)。
#include <stdio.h>
typedef volatile unsigned char XBYTE;
#define var (* (XBYTE * )(0x0100))
int main()
{
printf("Hello World\n");
printf("the address of var is %x\n",&var);
return 0;
}
我很确定该片段是关于将在地址 100h 分配的“var”,但问题是我无法通过指针判断它是如何工作的。
另外,这样声明会不会有潜在的问题?
谢谢
是的,代码可以编译并且有效。
volatile
关键字表示变量可以更改其值而无需显式写入它,例如定时器寄存器。
所以 XBYTE
是一个引用 unsigned char
的类型,另外,它是 volatile
。
但是,它并不是指已知的实际内存位置,它只是任何此类 unsigned char 类型的易失性寄存器的 typedef。
这就是 #define
出现的地方。如果被分解,它会将 int 值 0x0100 常量转换为指向 XBYTE 的指针。然后在第二步中,它推迟该指针以允许访问该内存位置。所以我们最终得到了一种访问 volatile uchar @ 0x100 的方法。
注意,这是让 C 代码在没有运行时开销的情况下引用显式常量内存地址的唯一方法。
我看到一种我无法理解的使用C声明变量的方法 (因为它只是整个嵌入式系统程序中的一小部分,所以我在下面尝试更简单地重现它)。
#include <stdio.h>
typedef volatile unsigned char XBYTE;
#define var (* (XBYTE * )(0x0100))
int main()
{
printf("Hello World\n");
printf("the address of var is %x\n",&var);
return 0;
}
我很确定该片段是关于将在地址 100h 分配的“var”,但问题是我无法通过指针判断它是如何工作的。
另外,这样声明会不会有潜在的问题?
谢谢
是的,代码可以编译并且有效。
volatile
关键字表示变量可以更改其值而无需显式写入它,例如定时器寄存器。
所以 XBYTE
是一个引用 unsigned char
的类型,另外,它是 volatile
。
但是,它并不是指已知的实际内存位置,它只是任何此类 unsigned char 类型的易失性寄存器的 typedef。
这就是 #define
出现的地方。如果被分解,它会将 int 值 0x0100 常量转换为指向 XBYTE 的指针。然后在第二步中,它推迟该指针以允许访问该内存位置。所以我们最终得到了一种访问 volatile uchar @ 0x100 的方法。
注意,这是让 C 代码在没有运行时开销的情况下引用显式常量内存地址的唯一方法。