无论签名如何,函数指针都有效惊

时间:2011-12-31 21:30:02

标签: c++ events

我正在实现一个用于测试目的的小型库,用于学习事件处理和在标准C ++中声明事件。

经过一段时间的努力和调试我的生物,我终于得到了它的工作!!

以下是示例代码:

#include "Event.h"
#include "Handler.h"
using namespace System;  // lol yeah, I wrapped all into namespace called System (like .NET) :D

//this is the actual event trigger function:
int x(int) {
    Write "event!!";
    return 0;
}
    typedef void (*EventHandler)();  //this is funny( pointer to int(*)(int)


//simple implementing new keywords: (macros and typedefs)

int main() {
    event test;  //new event
    Handler hnd(test, EventHandler(x));  // EventHandler takes void(*)() NOT int(*)() !!!
    emit(test);  //raise event triggers the x function with no problem
    return 0;
}

怎么编译没有错误?

我会粘贴所有代码,但它很复杂......

我的问题是:我很担心typedef的{​​{1}}工作得很好吗?

编译输出很好,无论“事件触发器功能”的签名是什么都没有错误。

1 个答案:

答案 0 :(得分:3)

此:

EventHandler(x)

是施法操作:

它在语法上等同于:

((EventHandler)x)

所以你使用强制转换操作符将x(int(*)(int))转换为一个EventHandle(void(*)())

Cast操作在没有警告的情况下完成,因为您基本上是在告诉编译器:
"I know better than you what is actually going just believe me OK!"

底层的emit()只是在没有任何参数的情况下调用指向的函数 这很糟糕。

函数X()期望一个不存在的参数。取决于ABI,被调用的函数可以整理(这可能不是很好),幸运的是X不会使用参数,因为它也是未定义的。

函数X()应该返回一个值(不这样做是未定义的行为)。然而,调用函数不期望返回值,因此这样做将是未定义的行为,因为取决于您可能覆盖重要数据的ABI。