2011-01-14 35 views

Trả lời

51

Những câu trả lời khác cũng tốt - trong một số trường hợp -.

A) tuyên bố nó static sẽ phát ra bản sao cho mỗi bản dịch. Điều đó là tốt nếu nó hiển thị chính xác một bản dịch (nghĩa là định nghĩa của nó nằm trong tệp .m/ .c) của bạn. Nếu không, bạn kết thúc với các bản sao trong mọi bản dịch bao gồm/nhập tiêu đề với định nghĩa tĩnh. Điều này có thể dẫn đến một nhị phân tăng cao, cũng như tăng thời gian xây dựng của bạn.

B) const CGRect CGRectOne = {...}; sẽ phát ra một biểu tượng trong phạm vi được khai báo. nếu điều đó xảy ra là một tiêu đề hiển thị với nhiều bản dịch, bạn sẽ kết thúc với các lỗi liên kết (vì CGRectOne được xác định nhiều lần - ví dụ: một lần cho mỗi tệp .c/ .m trực tiếp hoặc gián tiếp bao gồm tiêu đề được xác định).

Bây giờ bạn đã biết ngữ cảnh để sử dụng 2 tờ khai đó, hãy che cách cách extern. Cách extern cho phép bạn:

  • tuyên bố hằng số trong một tiêu đề
  • sử dụng liên tục trong nhiều bản dịch
  • trong khi phát ra đúng một định nghĩa của hằng số

Cách tiếp cận extern là lý tưởng để sử dụng lại hằng số giữa nhiều tệp. Dưới đây là một ví dụ:

File.h

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

file.c/m

// the definition: 

#import "File.h" 

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

Lưu ý: Bỏ các const sẽ chỉ làm cho nó một biến toàn cầu.

+0

lưu ý: về mặt kỹ thuật, bạn có nhiều tùy chọn hơn với C++ - tôi trả lời như thể câu hỏi là c/objc. – justin

+1

Cảm ơn bạn! – jchatard

+1

Điều này đã giúp tôi rất nhiều. Câu trả lời tốt. –

6

Something như thế này

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

Tính năng này có hoạt động không? Tôi chưa bao giờ thấy cú pháp đó và tôi không thể biên dịch nó. –

+0

Đó là một tính năng C99 được gọi là Hợp chất Literals. – Nyx0uf

+0

Ah, tôi hiểu rồi. Mát mẻ. Tôi bật hỗ trợ C99 bằng cách sử dụng '-std = c99' trong" Cờ C khác ", và bây giờ nó cũng làm việc cho tôi. –

21

Có một vài lựa chọn. Với C89,

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

với C99,

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

hoặc

const CGRect CGRectOne = { 
    .origin = { .x = 0.0f, .y = 0.0f }, 
    .size = { .width = 1.0f, .height = 1.0f } 
}; 
Các vấn đề liên quan