宏((void(*)())0)()是什么意思?

时间:2012-03-22 15:20:07

标签: c++ c macros

以下宏的结果很清楚:

#define CRASH() do {\
  *(int *)(uintptr_t)0xbbadbeef = 0;\
  ((void(*)())0)();\
} while (false)

我的问题是,该行是什么

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

用英语分解?例如,“这是一个返回指向....的函数”

9 个答案:

答案 0 :(得分:14)

看起来它将0转换为函数指针(带有不带参数的签名并具有void返回类型),然后调用它。

(     (            void(*)()                  ) 0       )      ();
  /* cast..*/ /* fn pointer signature */  /*..cast 0 */  /* invocation */

另一种方式是说它试图调用(调用)一个预期位于地址0x00000000的内存中的函数 - 这保证是一个无效的地址。

答案 1 :(得分:3)

  • 0投射到指向 void函数的指针,可以不带参数调用(表达式的(void(*)())0部分)
  • 通过带有空参数列表的指针(后面是()部分)调用该函数。

编辑1 :编辑以回应Cristoph的评论。

答案 2 :(得分:2)

它将0转换为函数指针,其中函数不带参数并返回void,然后尝试调用此函数。它基本上取消引用空指针。

答案 3 :(得分:2)

它会向不带参数的方法转换NULL指针,并返回void,并尝试调用此方法。

毋庸置疑,它会崩溃,因此名称CRASH非常适合。

答案 4 :(得分:0)

它将0转换为指向函数的指针,然后尝试调用该函数。这将导致段错误和崩溃。

编辑:对这些问题的竞争太多了。全面响起,我要睡觉了:)

答案 5 :(得分:0)

这意味着“将NULL指针视为void function()的指针,调用function()”。

答案 6 :(得分:0)

它取值为零,并将其强制转换为不返回任何内容的函数指针(void)。

据推测,目的是当你调用这个“函数”时,它会调用地址为零,这应该会使应用程序崩溃。

答案 7 :(得分:0)

对我来说,翻译成不同的C ++更简单,而不是直接翻译成英文:

typedef void (void_func_t)();       // type of a function taking no arguments 
                                    // and returning void
typedef void_fnct_t* void_func_ptr; // pointer to such a function
static_cast<void_func_ptr>(0)();    // call that function
// ((void_func_ptr)0)();            // pure C equivalent cast

答案 8 :(得分:0)

如果fp是指向函数的指针,* fp是函数本身,所以( fp)()是调用它的方法。 ANSI C允许将其缩写为fp(),请记住它只是一个缩写。 ------- C陷入困境。 ((void()())0)()是((void()())0)()

的avvreviation