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

jch*_*ard 21 static struct constants objective-c extern

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

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

我该怎么说呢?

谢谢,Jérémy

jus*_*tin 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;
Run Code Online (Sandbox Code Playgroud)

File.c /米

// the definition:

#import "File.h"

const CGRect CGRectOne = { { 0.0f, 0.0f }, { 1.0f, 1.0f } };
Run Code Online (Sandbox Code Playgroud)

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


小智 21

有几种选择.有了C89,

const CGRect CGRectOne = { { 0.0f, 0.0f }, { 1.0f, 1.0f } };
Run Code Online (Sandbox Code Playgroud)

有了C99,

const CGRect CGRectOne = {
    .origin.x = 0.0f,
    .origin.y = 0.0f,
    .size.width = 1.0f,
    .size.height = 1.0f
};
Run Code Online (Sandbox Code Playgroud)

要么

const CGRect CGRectOne = {
    .origin = { .x = 0.0f, .y = 0.0f },
    .size   = { .width = 1.0f, .height = 1.0f }
};
Run Code Online (Sandbox Code Playgroud)


Nyx*_*0uf 6

像这样的东西

static CGRect CGRectOne = (CGRect){.origin.x = 1.0f, .origin.y = 1.0f, .size.width = 1.0f, .size.height = 1.0f};
Run Code Online (Sandbox Code Playgroud)