我正在实现一个用于测试目的的小型库,用于学习事件处理和在标准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}}工作得很好吗?
编译输出很好,无论“事件触发器功能”的签名是什么都没有错误。
答案 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。