函数指针工作,不管签名?惊喜

Function pointer works regardless of signature? Surprise

本文关键字:惊喜 不管 指针 工作 函数      更新时间:2023-10-16

我正在实现一个用于测试目的的小库,以学习如何在标准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;
}

为什么编译没有错误??

我想粘贴所有的代码,但是它很复杂…

我的问题是:我很困惑EventHandlertypedef是如何工作的?

编译输出正常,无论"事件触发函数"的签名是什么都没有错误

This:

EventHandler(x)

是强制转换操作:

在语法上相当于:

((EventHandler)x)

因此,您正在使用强制转换操作符将x (int (*)(int))转换为EventHandle (void (*)())

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

底层的emit()只调用指向的函数,不带任何参数。

函数X()需要一个不存在的参数。根据ABI的不同,被调用的函数可能会对其进行整理(这可能不是很好),幸运的是,X没有使用参数,因为它也是未定义的。

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