Objective c GCC/Clang设置为强制-Wpointer到int强制转换为始终记录
我的问题涉及到在我现在的公司之前的一些重构工作。长话短说,在某一点上,一个属性有一种类型(我猜是)Objective c GCC/Clang设置为强制-Wpointer到int强制转换为始终记录,objective-c,c,gcc,Objective C,C,Gcc,我的问题涉及到在我现在的公司之前的一些重构工作。长话短说,在某一点上,一个属性有一种类型(我猜是)NSInteger,并被更改为NSNumber*。当前代码的编译是因为在整个代码库中随意添加了(long)强制转换,但在语义上这是完全不同的,因为它对指针的值进行操作;此外,该属性的名称不是唯一的,并且被使用了数千次 如果指针的大小不等于long的大小,但在两种平台上,sizeof(long)==sizeof(void*),GCC通常能够通过-Wpointer to int cast捕捉到这一点 我
NSInteger
,并被更改为NSNumber*
。当前代码的编译是因为在整个代码库中随意添加了(long)
强制转换,但在语义上这是完全不同的,因为它对指针的值进行操作;此外,该属性的名称不是唯一的,并且被使用了数千次
如果指针的大小不等于long的大小,但在两种平台上,sizeof(long)==sizeof(void*)
,GCC通常能够通过-Wpointer to int cast
捕捉到这一点
我的问题是,当指针类型用作算术类型时,GCC是否可以始终记录警告,而不管语句是否具有强制转换?通过“log”,您的意思是生成诊断(在编译时),而不是在运行时记录,对吗?对,诊断(警告或错误)在编译时
/*WarnMePlease.pch*/#ifdef FIXIN_UR_LEGACEEZ#define long uint8#t#endif
可能使您能够捕获它们?这可以作为临时替代,尽管如果您在程序中的任何其他地方以有效的方式使用long
s,该方法可能会产生大量噪音。一种不太受欢迎但可能不太吵闹的方法可能只是在项目中搜索所有的(long)
强制转换并审核它们(或者如果您很勇敢,搜索并删除它们,然后从中开始工作,一次删除一个编译警告/错误)。您可以做的另一件事是尝试在64位平台上编译项目,其中int
和long
的大小不同,使用-Wpointer进行int cast
;如果你的目标是像Apple Watch这样的东西,这对你的项目可能是不可能的,但值得一试。所谓“日志”,你的意思是生成一个诊断(在编译时),而不是在运行时记录一些东西,对吗?对,诊断(警告或错误)在编译时/*WarnMePlease.pch*/#ifdef FIXIN_UR_LEGACEEZ#define long uint8#t#endif
可能使您能够捕获它们?这可以作为临时替代,尽管如果您在程序中的任何其他地方以有效的方式使用long
s,该方法可能会产生大量噪音。一种不太受欢迎但可能不太吵闹的方法可能只是在项目中搜索所有的(long)
强制转换并审核它们(或者如果您很勇敢,搜索并删除它们,然后从中开始工作,一次删除一个编译警告/错误)。您可以做的另一件事是尝试在64位平台上编译项目,其中int
和long
的大小不同,使用-Wpointer进行int cast
;如果你的目标是苹果手表之类的东西,那么这对你的项目来说可能是不可能的,但值得一试。