1. 主页
  2. 文档
  3. C语言教程
  4. C语言预处理器
  5. CRASH() 宏——解释

CRASH() 宏——解释

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

#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; /* 字面量零 */ (0); ( ()0 ); /* 0 被强制转换为某种类型 */  ( (*) 0 ); /* 0 转换了一些指针类型 */  ( (*)() 0 ); /* 0 转换为指向某个函数的指针 */  ( void (*)(void) 0 ); /* 将 0 解释为函数的地址,  什么都不接受,什么也不返回 */  ( void (*)(void) 0 )(); /* 调用函数 */

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

 

 

这篇文章对您有用吗?