Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 奇怪的行为,用int初始化函数指针?_C++_Visual Studio 2012_Casting_Initialization_Function Pointers - Fatal编程技术网

C++ 奇怪的行为,用int初始化函数指针?

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)的真正底层语法是什么,是强制转换还是初始化 如何用整数初始化函数指针 第四个表达式应该编

无意中,我发现这段代码是在VS2012上编译的

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)()的函数;真是奇怪的行为。看看