2010-09-23 152 views

回答

3

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

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

在代码中显示转换发生,因此读取代码的程序员不会忘记,这个转换是“好的”。从某种意义上说,它是“坏”的,它可能会压制编译器会给你的任何警告,说明这种转换是危险的。

因此,如果您绝对有信心转换将始终有效,那么您需要投射(以抑制警告)。如果你没有信心,那么你不需要演员(你可能应该避免转换或者自信)。

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

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

+0

其实,它是一个CGFloat。在iphone上,这意味着itr目前是* float,但是苹果可能会选择在以后使用它(他们已经在Mac OS X运行时改变了它)。)。 – JeremyP 2010-09-23 12:47:23

+0

@JeremyP:够公平的。 – 2010-09-23 13:58:08

+0

我想我只是使用CGFloat代替。这样做的目标是得到一个没有小数位的整数。 – openfrog 2010-09-23 15:02:15

2

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

4

您应该使用正确的类型,可能是CGFloat。 size_t是int'ish和不适当的。

+0

取决于您使用的是什么。举一个例子,'CGBitmapContextCreate'为它的宽度参数使用'size_t'。 – 2010-09-23 17:04:32

1

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

就你而言,演员阵容是不需要的(但没有错,只是多余的)。

你需要投

  • 参数与printf当他们不转换规范
    printf("%p\n", (void*)some_pointer)
  • 参数匹配is*()(ISDIGIT,ISBLANK,...)和toupper()tolower()
    if (isxdigit((unsigned char)ch)) { /* ... */ }
  • (如果我还记得更多,我会在这里添加它们)
+0

您应该将'is */to *'的参数强制转换为'(unsigned char)',而不是简单的'(unsigned)'。 – schot 2010-09-23 15:29:21

+0

谢谢schot,改变了 – pmg 2010-09-23 16:18:48

1

size_t类型是为了完全不同的东西,你不应该将它用于这种目的。
其目的是表达内存中不同类型的大小。例如,sizeof(int)的类型为size_t,它返回int类型的大小。

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