【结构体】解决火山PC传递(嵌套)结构体的优化方案

本文方法涛哥不是很认可!!!

各位封装用户应该都知道,火山PC调用外部库时,当函数参数为结构体(struct类型)时非常麻烦

官方提供的结构体基础类啥的 ,恕我直言,花里胡哨的,瞅了一眼,没看懂,也没仔细看,也不想看了...

---------------------------------------------------------------------------

各位封装用户大多是都是采用  嵌入类成员变量 来操作的 

简单点的结构体还好说 ,比如RECT 也就4个成员 写四个属性读 四个属性写 就解决了  

但是!!! 当结构体复杂时,尤其是嵌套结构体 ,难不成 每一种 组合类型的结构体 都要重新写一遍??? 

因此本文就是解决这个问题的!

因此本文就是解决这个问题的!

因此本文就是解决这个问题的!

-----------------------------------------

懂C++的应该知道结构体也是一种类,特殊的类,不懂得百度  

那为什么火山的类强制转换结构体不能用呢? 

问题在于 火山默认所有的类都会继承CVolObject 也就是 对象类  ,这个类里有成员变量 用于各种类和数据类型判断是否为空对象等

经过我的不懈研究,发现  @外部基础类 会使所在类不会继承 CVolObject  ,但是翻译的时候还会自动在类里面添加 一行宏,

当火山的类 没有类成员时  为 DECLARE_EMPTY_VOL_CLASS  有成员则为 DECLARE_VOL_CLASS  

不去掉会报错,这个翻译的过程我办法取消,不让它生成 但是 既然是宏 就可以#undef  !!!! 意思是取消宏

通过@视窗.前缀文本  可以在class前面加 #undef   但是取消宏 还是会导致下面宏未定义 ,所以紧接着用#define 把这个宏定义为空 

总结 @视窗.前缀文本 的内容如下,注意 最后的/**/ 不能省略  不然 翻译的时候不会换行 

#undef DECLARE_VOL_CLASS
#define DECLARE_VOL_CLASS(name_space, class_name) 
#undef DECLARE_EMPTY_VOL_CLASS 
#define DECLARE_EMPTY_VOL_CLASS(name_space, class_name) 
/**/

Markup

Copy

如果仅仅是这样 还会导致 本类缺少函数定义和其他正常类报错,所以还需要恢复这个宏 并补上本类的函数定义 ,在类下添加以下内容

@begin
<include>
#undef DECLARE_VOL_CLASS
#define DECLARE_VOL_CLASS(name_space, class_name)          DECLARE_VOL_CLASS_NOT_OVR_COMP (name_space, class_name)          _DECLARE_VOL_CLASS_COMPARE_OPERATOR (class_name)
#undef DECLARE_EMPTY_VOL_CLASS
#define DECLARE_EMPTY_VOL_CLASS(name_space, class_name)          DECLARE_EMPTY_VOL_CLASS_NOT_OVR_COMP (name_space, class_name)          _DECLARE_VOL_CLASS_COMPARE_OPERATOR (class_name)
BOOL @sn<current_class>::_IsSelfEqual (const @sn<current_class>& objCompare) const;
void @sn<current_class>:: _CopySelfFrom (const @sn<current_class>& objCopyFrom);
public:   
inline_ BOOL operator== (const @sn<current_class>& objCompare) const  { return (this == &objCompare); } 
inline_ BOOL operator!= (const @sn<current_class>& objCompare) const  { return (this != &objCompare); }
inline_ void LoadFromStream (CVolBaseInputStream& stream){}
inline_ void SaveIntoStream (CVolBaseOutputStream& stream){}
</include>
@end

Markup

Copy

以RECT为例

你可以选择直接使用 @外部基础类  "RECT"  然后写4个属性读  4个属性写的函数 来给left ,top,right,bottom赋值

如果不想直接继承,关键@外部基础类 还不能空着 咋办???  写一个头文件 或者去系统文件里  写一个空类 

案例给的是 

class emptybass { };

Markup

Copy

那么就填写@外部基础类 "emptybass "     即可  此步骤非常重要

如此就完成了,纯粹的类,没有杂质的类,没有额外类成员的类!!!

下面你就可以实现嵌套结构类,而不用像之前那么不断从头写了

 直接在火山类成员类型使用你写好的类就行  具体的可以参考案例

最后再说下 嵌入调用的传递问题 

类直接强转结构体是行不通的 需要通过指针中转下

例如  火山函数  的参数  为   rect   RECT类     // RECT类是火山的类执行以上操作

c++函数为 void test_rect(RECT rc)

嵌入写法是

@ test_rect (*(RECT*)&@<rect> );

Markup

Copy

-----------------------------------------------------------------------

最后再说下可能出现的问题

伴随着版本更新,本文解决方案可能会出现新的报错!!!

我白天给涛哥发的 是今天 2021年9月30日新版本更新之前的 案例 正常使用  

然后今天下午更新了,涛哥又是晚上才接收的案例,然后就报错了 

然后我就继续研究了  成功了...

不敢保证以后的版本 涛哥又会往里面加什么内容 ,也不敢保证能不能继续解决

但是 至少目前的版本应该能用很长时间

本文章原文地址:【结构体】解决火山PC传递(嵌套)结构体的优化方案-利快云博客阅读 (lkuaiy.com)

猜你喜欢

转载自blog.csdn.net/qq1185907650/article/details/120567191