Đây là câu hỏi C/Objective-C newbie :-)Làm thế nào để khai báo CGRectZero rất riêng của tôi như hằng số?
Giả sử tôi muốn một hằng số CGRectOne và CGRectTwo.
Tôi làm cách nào để khai báo?
Cảm ơn, Jérémy
Đây là câu hỏi C/Objective-C newbie :-)Làm thế nào để khai báo CGRectZero rất riêng của tôi như hằng số?
Giả sử tôi muốn một hằng số CGRectOne và CGRectTwo.
Tôi làm cách nào để khai báo?
Cảm ơn, Jérémy
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:
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.
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};
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ó. –
Đó là một tính năng C99 được gọi là Hợp chất Literals. – Nyx0uf
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. –
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 }
};
Kỹ thuật sử dụng ở đây làm việc tốt cho tôi: http://www.cocos2d-iphone.org/forum/topic/2612#post-16402
Về cơ bản phương pháp extern của nó được mô tả bởi Justin, nhưng nó cung cấp một ví dụ khá đầy đủ.
Ngoài ra, câu trả lời này trên StackOverflow cũng cung cấp một ví dụ tốt: Constants in Objective-C
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
Cảm ơn bạn! – jchatard
Điều này đã giúp tôi rất nhiều. Câu trả lời tốt. –