当我尝试使用带有main函数的单个cpp文件
时,这是有效的 sprintf(smem_options ,
"#transcode{vcodec=RV24}:smem{"
"video-prerender-callback=%lld,"
"no-time-sync},"
, (long long int)(intptr_t)(void*)&cbVideoPrerender
);
如何将函数参数传递给类中的sprintf?
sprintf(smem_options ,
"#transcode{vcodec=RV24}:smem{"
"video-prerender-callback=%lld,"
"no-time-sync},"
, (long long int)(intptr_t)(void*)&cbVideoPrerender
);
我得到的错误信息是:错误C2276:'&' :对绑定成员函数表达式的非法操作
答案 0 :(得分:13)
假设cbVideoPrerenderer
是第二个示例中的成员函数,您需要说&Foo::cbVideoPrerenderer
其中Foo
是其所属的类。
但只有当它是静态成员函数时才会有效。非静态成员函数与普通函数不同,当您使用&Foo::bar
语法形成指向成员函数的指针时,您获取的内容无法转换为void*
(通常是比指针大两倍的东西,因为它包含有关对象类型的信息。)
答案 1 :(得分:4)
你要做的是在C ++ 11中有条件支持的行为,
在这两种情况下,在早期版本中都是非法的。你不能可靠
将指向函数(成员或其他)的指针转换为void*
。
(我曾经在一个指向函数的指针是32位的系统上工作,但是a
void*
只有16。)
在实践中,大多数编译器(非法地,在C ++之前的11版本中)会忽略
非成员函数的错误。 Posix需要这个功能
指针和数据指针是兼容的,它们在Windows下
好。 (今天:只有他们不适合我的系统才是
早期的Unix。)至于指向成员的指针:指向静态成员的指针
有一个与函数指针兼容的类型(因此可以使用
练习,如果编译器允许它),但指向非静态的指针
会员有一个完全不同的类型,通常有不同的大小,
和不同的代表。关于唯一可靠的方法
输出一个是一系列字节值:将地址正确放入
键入变量,获取该变量的地址,将其转换为
unsigned char const*
,然后使用"%02x"
输出每个字节。
但真正的问题是你想要这样做的原因。没有什么 无论你如何,你都可以可靠地处理你输出的值 输出它。