xcode生成错误:从指针到较小类型“int”的语义问题强制转换会丢失信息

aelbi1ox  于 2023-03-31  发布在  其他
关注(0)|答案(2)|浏览(170)

我从不使用macs或xcode,但我现在需要为osx和ios构建一个C库。C代码在windows和android上构建得很好,但在xcode中,我得到了数百个红色的excmalation标记图标,表明这一点:

Semantic issue
 cast from pointer to smaller type
'int' loses information

下面是一行代码的示例,其中指示了此错误

fixturesArray.push_back((int)fixture->GetUserData());

我已经有一个问题构建与未使用的变量,我删除了一个标志-Werror,这修复了这个特殊的问题。有什么类似的我可以做这个问题?我假设这个问题是警告被视为错误。这里是其他标志仍然存在。

-Wall  -Wno-long-long -Wno-variadic-macros     -DNDEBUG -DDEBUG=0

更新:只有大约10个这样的错误示例(其他100个是警告)如果我在所有这些情况下将'int'改为'int 64',那么我就可以构建了。但我不想这样做,我确信这会导致问题,这不是程序应该如何工作的。
更新2:同样保持代码原样,只删除这些标志就可以进行构建
-Wno-long-long

wz1wpwve

wz1wpwve1#

这段代码在windows下运行良好,因为visual studio默认创建32位的二进制文件,而android是32位的平台,在这些平台上指针是32位的,int也是32位的,所以可以将指针存储在int类型的向量或变量中。
如果你的目标是Mac OS X,Xcode将默认构建64位和32位的二进制文件,并且你得到的警告实际上是告诉你在64位平台上将指针放在int变量中不是一个好主意,因为指针的一半值丢失了,你以后将无法检索它。
在您的案例中,您可以采用两种不同的解决方案:

  • 修复代码,将int更改为intptr_t并修复因此停止工作的任何内容。
  • 决定你不想修复它,所以你不打算支持64位平台。

在第二种情况下,你可以通过改变xcode上的一些选项来禁止构建64位二进制文件,而在mac os上只使用32位二进制文件。要做到这一点,请从target的“构建设置”中的“有效体系结构”设置中删除x86_64字符串(如果找不到该设置,请在google images中搜索xcode valid architectures build setting

50pmv0ei

50pmv0ei2#

好吧,似乎GetUserData()返回一个指针。这似乎有一个sizeof(void*) > sizeof(int),所以强制转换会切断一些东西
编辑:如果它能与int64一起工作,这证实了我的假设(你似乎坐在一台64位机器前)。我不知道你想做什么,但将指针转换为整数是一个坏主意。我建议你将fixturesArray作为一个合适的值类型的容器,如果你想让它更独立于架构工作的话。

相关问题