C++ 奇怪的行为,用int初始化函数指针?
无意中,我发现这段代码是在VS2012上编译的C++ 奇怪的行为,用int初始化函数指针?,c++,visual-studio-2012,casting,initialization,function-pointers,C++,Visual Studio 2012,Casting,Initialization,Function Pointers,无意中,我发现这段代码是在VS2012上编译的 typedef void (*func)(); func f = func(12); f以整数12作为其地址进行初始化。 据我所知,从整数到函数指针的转换是有效的,如下所示: func f = (func)12; 虽然语句func(12)看起来更像一个构造函数,所以我尝试了这个: func f(12); 它的编译失败了 所以我的问题是: func(12)的真正底层语法是什么,是强制转换还是初始化 如何用整数初始化函数指针 第四个表达式应该编
typedef void (*func)();
func f = func(12);
f
以整数12作为其地址进行初始化。
据我所知,从整数到函数指针的转换是有效的,如下所示:
func f = (func)12;
虽然语句func(12)
看起来更像一个构造函数,所以我尝试了这个:
func f(12);
它的编译失败了
所以我的问题是:
func(12)
的真正底层语法是什么,是强制转换还是初始化让我们一个接一个地看一下:
func f = (func)12 //ok, cast 1
这里,您使用显式转换将整数值12转换为函数指针。此强制转换不允许作为正常隐式转换,但它是可以接受的,因为C++可以使用<代码> RealTytCase< /Cult>将整数和指针类型彼此转换。它既不安全也不便于携带
func f = func(12); //ok, what? 2
这与上面的语法不同。只要类型
是基元类型,则语法(类型)值
和类型(值)
是相同的
func f(12); //failed 3
这里,您试图创建一个初始化为值12的func
类型的对象。只有在以下情况下,才允许使用这种类型的对象声明:
- 有一个构造函数可以进行转换(不适用;
是基元类型),或者func
- 源类型和定义类型之间定义了隐式转换(不适用;整型和指针类型之间没有隐式转换)
func f = 12; //failed 4
仅当存在可用于执行强制转换的非显式转换构造函数(不适用)或在源类型和目标类型之间定义了隐式转换(同样,不适用,因为在整数和函数指针类型之间未定义转换)时,此方法才有效。因此,您会得到一个错误
func f = 12; //failed 4
希望这有帮助 你的假设是错误的。通常,int不能强制转换为函数指针,反之亦然。在32位的Windows中,两者恰好都有32位,但例如,在64位的Windows中,指针当然是64位的,而int仍然是32位的。@cdoubleplusgood我并不是要将整数强制转换为函数指针,我只是想弄清楚为什么会编译:func f=func(12);可能是有一个名为
func
的函数,它接受一个整数并返回类型为void function_name()
@Smac89 typedef void(*func)()的函数;真是奇怪的行为。看看