带有附加圆括号的 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
以下语句在 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