📜  CRASH()宏–解释

📅  最后修改于: 2021-05-25 20:18:33             🧑  作者: Mango

下面给出了一个开源项目中的一小段代码,

#ifndef __cplusplus
  
typedef enum BoolenTag
{
   false,
   true
} bool;
  
#endif
  
#define CRASH() do { \
      ((void(*)())0)(); \
   } while(false)
  
int main()
{
   CRASH();
   return 0;
}

你能解释上面的代码吗?

很简单,下面给出了逐步的方法,

语句while(false)仅用于测试目的。考虑以下操作,

((void(*)())0)();

可以通过以下方式实现,

0;                      /* literal zero */
(0); ( ()0 );                /* 0 being casted to some type */
( (*) 0 );              /* 0 casted some pointer type */
( (*)() 0 );            /* 0 casted as pointer to some function */
( void (*)(void) 0 );   /* Interpret 0 as address of function 
 taking nothing and returning nothing */
( void (*)(void) 0 )(); /* Invoke the function */

因此,给定的代码正在调用其代码存储在零位置的函数,换句话说,试图执行存储在零位置的指令。在具有内存保护(MMU)的系统上,操作系统将引发异常(分段错误),而在没有此类保护的系统(小型嵌入式系统)上,操作系统将执行并且错误将进一步传播。

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。