给你一个眼神,自己体会

白日依山尽,黄河入海流。 欲穷千里目,更上一层楼。

在这里可以干嘛?

记录苦逼工作,记录美好生活

天天对着电脑?

搬砖,敲代码,干就是了,别废话

各种配置,各种坑

坑是不可能填得完了,填完一个挖一个

手机是干嘛的?

有空刷刷手机呗

近况如何?

牢骚,从这里开始

C++中typeid的用法

typeid是C++的关键字之一,等同于sizeof这类的操作符。typeid操作符的返回结果是名为type_info的标准库类型的对象的引用。


如果表达式的类型是类类型且至少包含有一个虚函数,则typeid操作符返回表达式的动态类型,需要在运行时计算;否则,typeid操作符返回表达式的静态类型,在编译时就可以计算。

测试1

#define OUTPUT(f)   cout << #f << "\t: " << typeid(f).name() << endl;  
class BaseA {};  
class DeriveA: public BaseA {};  
  
class BaseB   
{  
    virtual void f(){}   
};  
class DeriveB: public BaseB {};  
  
int main()  
{  
    cout << "-------直接处理类名-------" <<endl;  
  
    OUTPUT(BaseA);  
    OUTPUT(DeriveA);  
    OUTPUT(BaseB);  
    OUTPUT(DeriveB);  
  
    cout << endl << "-------基类不含虚函数-------" <<endl;  
  
    BaseA baseA;  
    DeriveA deriveA;  
    OUTPUT(baseA);  
    OUTPUT(deriveA);  
      
    BaseA* pa;  
    pa = &baseA;  
    OUTPUT(*pa);  
    OUTPUT(pa);  
    pa = &deriveA;  
    OUTPUT(*pa);  
    OUTPUT(pa);  
  
    cout << endl << "-------基类含有虚函数-------" <<endl;  
  
    BaseB baseB;  
    DeriveB deriveB;  
    OUTPUT(baseB);  
    OUTPUT(deriveB);  
  
    BaseB* pb;  
    pb = &baseB;  
    OUTPUT(*pb);  
    OUTPUT(pb);  
    pb = &deriveB;  
    OUTPUT(*pb);  
    OUTPUT(pb);  
}  

1.当typeid操作符的操作数是不带有虚函数的类类型时,typeid操作符会指出操作数的类型,而不是底层对象的类型。


2.如果typeid操作符的操作数是至少包含一个虚拟函数的类类型时,并且该表达式是一个基类的引用,则typeid操作符指出底层对象的派生类类型。

测试2

    运行时获知变量类型名称,可以使用 typeid(变量).name(),需要注意不是所有编译器都输出”int”、”float”等之类的名称,对于这类的编译器可以这样使用:float f = 1.1f; if( typeid(f) == typeid(0.0f) )。
    补充:对非引用类型,typeid是在编译时期识别的,只有引用类型才会在运行时识别。

#include <iostream>
#include <typeinfo>
using namespace std;
int main(void)
{
	// sample 1 
	cout << typeid(1.1f).name() << endl;
	// sample 2 
	class Base1 {};
	class Derive1 :public Base1 {};
	Derive1 d1;
	Base1& b1 = d1;
	cout << typeid(b1).name() << endl; // 输出"class Base1",因为Derive1和Base1之间没有多态性 
									   // sample 3, 编译时需要加参数 /GR 
	class Base2 {
		virtual void fun(void) {}
	};
	class Derive2 :public Base2 { };
	Derive2 d2;
	Base2& b2 = d2;
	cout << typeid(b2).name() << endl; // 输出"class Derive2",因为Derive1和Base1之间有了多态性 
									   // sample 4 
	class Derive22 :public Base2 { }; // 指针强制转化失败后可以比较指针是否为零,而引用却没办法,所以引用制转化失败后抛出异常 
	Derive2* pb1 = dynamic_cast<Derive2*>(&b2);
	cout << boolalpha << (0 != pb1) << endl; // 输出"true",因为b2本身确实是指向Derive2 
	Derive22* pb2 = dynamic_cast<Derive22*>(&b2);
	cout << boolalpha << (0 != pb2) << endl; // 输出"false",因为b2本身不是指向Derive22 
	try {
		Derive2& rb1 = dynamic_cast<Derive2&>(b2);
		cout << "true" << endl;
	}
	catch (bad_cast) {
		cout << "false" << endl;
	}
	try { Derive22& rb2 = dynamic_cast<Derive22&>(b2);  cout << "true" << endl; }
	catch (...) // 应该是 bad_cast,但不知道为什么在VC++6.0中却不行?因为VC++6.0默认状态是禁用 RTTI 的,启用方式:project->setting->c/c++->category->c++ Language 下面第二个复选框选中。 
	{
		cout << "false" << endl;
	} 
	
	system("pause");
	
	return 0;
}

本文转自:

https://blog.csdn.net/zkybeck_ck/article/details/51762541

FairyGUI在Cocos2d-x的接入和lua绑定

Cocos2d-x版本是3.17.2
FairyGUI库来自https://github.com/fairygui/FairyGUI-cocos2dx

最近发现一个挺好用的UI编辑器,就想加到最新的cocos2dx版本试试,测试可以使用。

预备

  • 复制libfairygui到frameworks\cocos2d-x\cocos\editor-support\fairygui
  • 修改CCLabel.h的672行,void updateBMFontScale();前添加virtual
  • 修改 cocos2d-x\tools\tolua\genbindings.py,添加fairygui一行:
'cocos2dx_fairygui.ini' : ('cocos2dx_fairygui', 'lua_cocos2dx_fairygui_auto'), \
  • 修改cocos2d-x\tools\bindings-generator\targets\lua\conversions.yaml里的ns_map:下添加fairygui的命名空间”fairygui::”: “fgui.”,另外,还要分别在中间和底部添加下面代码,以便处理Margin类型的转换。
"Margin": "ok &= luaval_to_margin(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
"Margin": "margin_to_luaval(tolua_S, ${in_value})"
  • 在frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual下新建fairygui目录,把下面四个文件拷进去。
lua_cocos2dx_fairygui_manual.hpp
lua_cocos2dx_fairygui_manual.cpp
LuaBasicConversions_fairygui.h
LuaBasicConversions_fairygui.cpp
  • 在cmd中,切换到frameworks\cocos2d-x\tools\tolua目录,运行python genbindings.py,正常的话会在frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto生成两个文件:
lua_cocos2dx_fairygui_auto.hpp lua_cocos2dx_fairygui_auto.cpp 

注意:运行genbindings.pys时,确保 python,cheetah, pyyaml,都是32位的,NDK使用r16以上 不然可能会出现各种问题

  • 修改frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual\lua_module_register.cpp,添加
#include "scripting/lua-bindings/manual/fairygui/lua_cocos2dx_fairygui_manual.hpp"

在lua_module_register中添加

register_all_cocos2dx_fairygui_manual(L);

接入Win32

  1. 在VS工程右键“添加” “现有项目”,找到libfairygui.vcxproj,在VS左侧下端选择“属性管理器”,展开libfairygui,在Debug和Release中分别添加现有属性表“cocos2dx.props”和“cocos2d_headers.props”,在cocos2d\2d目录下可以找到。
  2. 在VS中的libluacocos2d下的manual中新建项fairygui,并把四个文件添加进去。
  3. 打开属性表的“cocos2dx.props”,通用属性|链接器|输入|附加依赖项,添加libfairygui.lib

接入ios_mac

在xcode里的cocos2d_libs.xcodeproj下的editor-support下添加fairygui的引用,然后在Build Settings的左上角,选择cocos2d_libs(注意是蓝色图标),在User Header Search Paths中添加${SRCROOT}/../cocos/editor-support/fairygui/Classes。然后在cocos2d_lua_bindings.xcodeproj的auto和manual里添加对应的文件,貌似就可以了。

接入android

修改frameworks\cocos2d-x\cocos\Android.mk,在适当的位置添加

LOCAL_STATIC_LIBRARIES += fairygui_static
$(call import-module,editor-support/fairygui)

修改frameworks\cocos2d-x\cocos\scripting\lua-bindings\proj.android\Android.mk,
在适当的位置添加

LOCAL_SRC_FILES += ../manual/fairygui/lua_cocos2dx_fairygui_manual.cpp \
                   ../manual/fairygui/LuaBasicConversions_fairygui.cpp \
                   ../auto/lua_cocos2dx_fairygui_auto.cpp
LOCAL_C_INCLUDES
        $(LOCAL_PATH)/../../../editor-support/fairygui/Classes \
        $(LOCAL_PATH)/../manual/fairygui \
LOCAL_EXPORT_C_INCLUDES下添加
        $(LOCAL_PATH)/../manual/fairygui \

测试

测试比较简单,首先确保各平台运行正常,然后在lua里调用
fgui.UIPackage:addPackage(“res/test”)
加载test包即可,具体使用请参考官网http://www.fairygui.com

关于APP在iOS12以上版本出现闪退的问题 does not pass CT evaluation, result: 0x80008

最近跟一个渠道对接SDK,这边打包安装测试都没问题,然后把工程包给了渠道方去分包打包。

但是他们反馈闪退,我测试试了一下他们打的包,只有IOS12的机器才会闪退。 然后就看日志,发现这些输出:

AMFI: ‘/private/var/containers/Bundle/Application/77E43297-912F-4033-ABB2-10C01B81C412/game.app/game’ does not pass CT evaluation, result: 0x80008
AMFI: ‘/private/var/containers/Bundle/Application/77E43297-912F-4033-ABB2-10C01B81C412/game.app/game’: Unrecoverable CT signature issue, bailing out.
AMFI: code signature validation failed.

  上网 google了一下,发现原来是证书设置问题,打包机器上得证书设置不能是始终信任,应该是使用系统默认设置。iOS11及以下是OK的,应该是iOS12苹果调整了策略所以不可以了。

搜到的文章是:https://stackoverflow.com/questions/52440492/ios-app-wont-run-on-device-any-more-under-ios-12-unrecoverable-ct-signature-is/52506186

确保以下的证书 是使用   系统默认设置

  • Apple Worldwide Developer Relations Certification Authority
  • Developer ID Certification Authority
  • 你自己的打包证书

然后,问题就解决了。IOS12上不会闪退了。