函数指针工作,不管签名?惊喜
Function pointer works regardless of signature? Surprise
我正在实现一个用于测试目的的小库,以学习如何在标准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;
}
为什么编译没有错误??
我想粘贴所有的代码,但是它很复杂…
我的问题是:我很困惑EventHandler
的typedef
是如何工作的?
编译输出正常,无论"事件触发函数"的签名是什么都没有错误
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,您可能会覆盖重要数据。
相关文章:
- 是否有用于迭代向量的函数,而不管其类型如何?
- 如何认为两个结构相等,而不管它们的第二个属性如何?
- 为什么不管你输入什么,循环都会输出同样的东西
- 是否允许访问联合成员的公共基类,而不管存储的类型如何
- C++模板有问题(大惊喜!为什么这行不通?
- MinGW .exe 需要一些 gcc dll 的,不管代码是什么?
- std::find返回vec.end(),而不管值是否在vector中
- OpenGL代码工作,不管我使用什么输入/窗口处理程序
- 函数指针工作,不管签名?惊喜
- 是否有一种方法可以识别Windows命令提示符,而不管文件名或位置
- QLineEdit with QValidator:不管输入的有效性如何,对编辑完成做出反应
- c++数据成员.目标:在构造函数中初始化,然后不管,将const工作在这里
- 不管类是什么,c++都会找到函数的第一个实例
- 基本的计算器c++,没有错误,但代码只返回0,不管值是多少
- 使球以相同的速度移动,而不管分辨率(PONG)
- 不管是否初始化,使用sizeof(p[0])真的无害吗?