带有附加圆括号的 C++ 转换

C++ cast with additional round brackets

以下语句在 C++ 中的作用是什么?

(*JImageGetResource)(jimage, location, val, size);

该指令取自here

不是,那是没有类型转换,因为左括号里的东西是没有类型的。这是一个普通的函数调用。

左括号解引用指针JImageGetResource,得到的对象是可以用4个参数调用的东西

没有演员参与。 JImageGetResource是一个指针,在它前面加上*,就是dereferenced。 例如,您通常会在迭代器中看到这一点。

在你的例子中,它是一个函数指针。因此生成的代码将与 resultingFunction(jimage, location, val, size).

相同

第 1017 行:JImageGetResource = CAST_TO_FN_PTR(JImageGetResource_t, dll_lookup(handle, "JIMAGE_GetResource", path));

考虑到此声明

static JImageGetResource_t             JImageGetResource      = NULL;

表示名称JImageGetResource标识了一个JImageGetResource_t类型的指针,由NULL初始化。

还有这条记录

 JImageGetResource = CAST_TO_FN_PTR(JImageGetResource_t, dll_lookup(handle, "JIMAGE_GetResource", path));

是self-documented,表示JImageGetResource表示一个函数指针。

所以这个表达式语句

(*JImageGetResource)(jimage, location, val, size);

代表一个有四个参数的函数调用。

这条记录也可以这样写

JImageGetResource(jimage, location, val, size);

或者制作更混淆的代码(由于函数指示符隐式转换为指向函数的指针)甚至像:)

(***JImageGetResource)(jimage, location, val, size);

这是一个演示程序。

#include <iostream>

void hello( const char *s )
{
    std::cout << "Hello " << s << '\n';
}

typedef void ( *hello_t )( const char * );

int main() 
{
    hello_t fp = NULL;
    
    fp = hello;
    
    fp( "Michael Munta" );
    ( *fp )( "Michael Munta" );
    ( ***fp )( "Michael Munta" );
    
    return 0;
}

它的输出是

Hello Michael Munta
Hello Michael Munta
Hello Michael Munta