Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';这部分代码的意思是什么?_C++_C - Fatal编程技术网

C++ 什么';这部分代码的意思是什么?

C++ 什么';这部分代码的意思是什么?,c++,c,C++,C,有人能说出这个密码是什么意思吗 void (* const rvt[])(void) = { (void (*) (void))((unsigned long)&__STACK_END), // The initial stack pointer xkg_som, // The reset handler xnt_ISR, // The NMI

有人能说出这个密码是什么意思吗

void (* const rvt[])(void) = {
  (void (*) (void))((unsigned long)&__STACK_END), // The initial stack pointer
  xkg_som,                                  // The reset handler
  xnt_ISR,                                  // The NMI handler
  FaultISR,                                 // The hard fault handler
  IntDefaultHandler,                        // The MPU fault handler
  bgs_stm,                                  // The bus fault handler
  IntDefaultHandler,                        // The usage fault handler
  0,                                        // Reserved
  0,                                        // Reserved
  IntDefaultHandler,                        // The MPU fault handler
};

实际上我不理解它。

它定义了一个指向函数的指针数组,该数组不接受任何参数并返回void。然后用内存中一些寄存器的地址初始化数组,这些寄存器被转换为函数指针


它看起来像是用于嵌入式编程的中断向量表。

它定义了一个指向函数的指针数组,这些函数不带参数,返回void。然后用内存中一些寄存器的地址初始化数组,这些寄存器被转换为函数指针

void (* const rvt[])(void)
它看起来像用于嵌入式编程的中断向量表

void (* const rvt[])(void)
这定义了一个名为“rvt”的常量数组。它的元素是指向没有参数的void函数的指针

然后使用大括号初始化器列表初始化该数组。所以所有其他行都是这个数组的元素。第一个是指向_STACK_END的指针,它显然是错误的类型,因此需要转换为正确的类型(它将首先转换为unsigned long,然后转换为正确的函数类型指针)

顺便说一句:代码不完整,因为大括号没有闭合,或者可能是您的格式错误,因为最后一条注释包含闭合大括号

这定义了一个名为“rvt”的常量数组。它的元素是指向没有参数的void函数的指针

然后使用大括号初始化器列表初始化该数组。所以所有其他行都是这个数组的元素。第一个是指向_STACK_END的指针,它显然是错误的类型,因此需要转换为正确的类型(它将首先转换为unsigned long,然后转换为正确的函数类型指针)

顺便说一句:代码不完整,因为大括号没有闭合,或者可能是您的格式错误,因为最后一条注释包含闭合大括号

方式(由提供):

将rvt声明为返回void的函数(void)的常量指针数组


这是数组的[1]。此外,这意味着
rvt
的声明是一个定义


addresof运算符获取变量的内存地址

地址被强制转换为
无符号长
类型

转换后的值再次转换为返回void的函数指针(void),void是存储在数组中的函数指针的类型


数组的其余初始化值可以是函数名、函数指针或可以隐式转换为函数指针(如lambdas)的内容

方式(由提供):

将rvt声明为返回void的函数(void)的常量指针数组


这是数组的[1]。此外,这意味着
rvt
的声明是一个定义


addresof运算符获取变量的内存地址

地址被强制转换为
无符号长
类型

转换后的值再次转换为返回void的函数指针(void),void是存储在数组中的函数指针的类型



数组的其余初始化值可以是函数名、函数指针或可以隐式转换为函数指针(如lambdas)的东西。

这似乎是ARM Cortex M微控制器的中断向量表

与大多数其他MCU相比,ARM Cortex的一个特点是,它在程序启动之前设置了堆栈指针。其他MCU倾向于在运行时设置它

因此,表中的第一个条目是程序启动时堆栈指针应设置的值
\uuu STACK\u END
可能是从链接器获得的某个常量。强制转换
(void(*)(void))
将其转换为函数指针。从指针转换为int到函数指针有点可疑,但它可能适用于大多数嵌入式C编译器,尽管C标准对此表示不满

其余条目是中断服务例程(函数)的函数地址。也就是说,它们与函数指针是一样的。您可以通过为函数指针指定函数名来初始化它

因此,整个向量表被声明为函数指针数组,其中每个函数都有签名
void func(void)
*const
声明意味着函数指针本身是只读的。这意味着它们将在flash中分配,这对于向量表来说是合适的。在闪存中,向量表通常分配在固定的保留地址

编写相同代码的更好方法是:

typedef void (isr_t)(void);

isr_t* const [] = {
  (isr_t* const)((uintptr_t)&__STACK_END),  // The initial stack pointer
...

uintpttr\u t
是一个足够大的整数类型,保证能够保存地址,不像
无符号长

这似乎是ARM Cortex M微控制器的中断向量表

与大多数其他MCU相比,ARM Cortex的一个特点是,它在程序启动之前设置了堆栈指针。其他MCU倾向于在运行时设置它

因此,表中的第一个条目是程序启动时堆栈指针应设置的值
\uuu STACK\u END
可能是从链接器获得的某个常量。强制转换
(void(*)(void))
将其转换为函数指针。从指针转换为int到函数指针有点可疑,但它可能适用于大多数嵌入式C编译器,尽管C标准对此表示不满

其余条目是中断服务例程(函数)的函数地址。也就是说,它们与函数指针是一样的。您可以通过为函数指针指定函数名来初始化它

因此,整个向量表被声明为函数指针数组,其中每个函数都有签名
void func(void)
*const
&__STACK_END
(unsigned long)&__STACK_END)
(void (*) (void))((unsigned long)&__STACK_END)
typedef void (isr_t)(void);

isr_t* const [] = {
  (isr_t* const)((uintptr_t)&__STACK_END),  // The initial stack pointer
...