我必须这样投吗?

时间:2010-09-23 09:13:57

标签: iphone c core-graphics

size_t pixelsWidth = (size_t)bitmapSize.width;

或者在没有施放尺寸的情况下完全没问题? bitmapSize的类型为CGSize ...

5 个答案:

答案 0 :(得分:4)

你应该使用正确的类型,这可能是CGFloat。 size_t是一种不合适的东西。

答案 1 :(得分:3)

在这种情况下,bitmapSize.width的类型为CGFloat(目前在iPhone上为float。)

float转换为size_t具有未定义的行为(根据C标准 - 如果转换的值不适合size_t,则不确定Apple是否提供任何进一步的保证) 。当它适合时,转换失去了小数部分。转换是隐式转换还是显式转换没有区别。

演员表示“好”,因为它在代码中显示转换发生,因此读取代码的程序员不会忘记。从某种意义上讲,它可能会抑制编译器会给你的这种转换带来危险的任何警告。“

因此,如果您完全确信转换将始终有效,那么您需要转换(禁止警告)。如果你没有信心,那么你不想要演员(你可能要么避免转换,要么自信)。

在这种情况下,就尺寸而言,转换似乎是安全的。假设您的CGSize对象表示实际UI元素的大小,它将不会那么大。代码中的注释会很好,但这是程序员在第五十次之后停止评论的事情,并且开始认为它“显而易见”当然图像宽度适合size_t

另一个问题是转换是否对分数是安全的。在什么情况下,如果有的话,大小是否会是分数?

答案 2 :(得分:2)

C支持隐式转换,如果size_t由于某种原因不如CGSize精确,你也会收到警告。

答案 3 :(得分:1)

通常不需要演员(有时候是错的)。 C大部分时间做“正确的事”。

在你的情况下,不需要演员表(但没有错,只是多余的)。

你需要施放

  • 当printf与转换规范不匹配时的参数
    printf("%p\n", (void*)some_pointer)
  • is*()(isdigit,isblank,...)和toupper()以及tolower()的参数
    if (isxdigit((unsigned char)ch)) { /* ... */ }
  • (如果我还记得更多,我会在这里添加)

答案 4 :(得分:1)

size_t类型用于完全不同的类型,您不应将其用于此类用途 其目的是在内存中表达不同类型的大小。例如,sizeof(int)的类型为size_t,并返回int类型的大小。

正如其他人所建议的那样,为该变量使用适当的类型。