如何声明我自己的CGRectZero像常量?

时间:2011-01-14 10:13:42

标签: objective-c static struct constants extern

这是一个新手C / Objective-C问题: - )

假设我想要一个CGRectOne和一个CGRectTwo常量。

我该如何宣布?

谢谢, 的Jérémy

4 个答案:

答案 0 :(得分:51)

其他答案很好 - 在某些情况下 - 。

A)声明它static将为每次翻译发出一份副本。如果只对一个翻译可见(即其定义在 .m / .c文件中),那就没问题了。否则,您最终会在每个翻译中包含/导入带有静态定义的标头。这可能会导致二进制文件膨胀,并且会增加构建时间。

B)const CGRect CGRectOne = {...};将在声明的范围内发出符号。如果碰巧是多个翻译可见的标题,你最终会出现链接错误(因为CGRectOne被多次定义 - 例如每个 .c / .m文件一次或间接包括定义常量的标题。)

现在您已了解使用这两个声明的上下文,请使用extern方式。 extern方式允许您:

  • 在标题
  • 中声明常量
  • 在许多翻译中使用常量
  • 同时发出一个常量
  • 的定义

extern方法非常适合在多个文件中重用常量。这是一个例子:

<强> File.h

// the declaration in the header:
extern const CGRect CGRectOne;

<强> File.c /米

// the definition:

#import "File.h"

const CGRect CGRectOne = { { 0.0f, 0.0f }, { 1.0f, 1.0f } };

注意:省略const只会使它成为一个全局变量。

答案 1 :(得分:21)

有几种选择。有了C89,

const CGRect CGRectOne = { { 0.0f, 0.0f }, { 1.0f, 1.0f } };

使用C99,

const CGRect CGRectOne = {
    .origin.x = 0.0f,
    .origin.y = 0.0f,
    .size.width = 1.0f,
    .size.height = 1.0f
};

const CGRect CGRectOne = {
    .origin = { .x = 0.0f, .y = 0.0f },
    .size   = { .width = 1.0f, .height = 1.0f }
};

答案 2 :(得分:6)

像这样的东西

static CGRect CGRectOne = (CGRect){.origin.x = 1.0f, .origin.y = 1.0f, .size.width = 1.0f, .size.height = 1.0f};

答案 3 :(得分:0)

这里使用的技术对我很有用:http://www.cocos2d-iphone.org/forum/topic/2612#post-16402

基本上是Justin描述的extern方法,但它提供了一个非常完整的例子。

此外,StackOverflow上的这个答案也提供了一个很好的例子:Constants in Objective-C