常数由另一个名称

时间:2010-05-26 02:02:07

标签: c objective-c constants

首先,我看过this question,并了解为什么以下代码不起作用。那不是我的问题。

我有一个常量,声明为;

//Constants.h
extern NSString * const MyConstant;

//Constants.m
NSString * const MyConstant = @"MyConstant";

但是,在某些情况下,让常量具有更具描述性的名称更为有用,例如MyReallySpecificConstant。我希望这样做:

//SpecificConstants.h
extern NSString * const MyReallySpecificConstant;

//SpecificConstants.m
#import "Constants.h"
NSString * const MyReallySpecificConstant = MyConstant;

显然我不能这样做(在上面的链接问题中有解释)。

我的问题是:

除了像#define MyReallySpecificConstant MyConstant这样的东西之外,我能在多个名字下提供一个常量吗?

3 个答案:

答案 0 :(得分:6)

通常,编译器会将相同的字符串常量折叠到相同的字符串中,除非您告诉它不要。即使你不能用另一个常量初始化一个常量,用相同的值初始化它们也会产生相同的净效果。

//Constants.h
extern NSString * const MyConstant;
extern NSString * const MyOtherConstant;

//Constants.m
#define MyConstantValue "MyConstant"
NSString * const MyConstant = @MyConstantValue;
NSString * const MyOtherConstant = @MyConstantValue;

将#define隐藏在一个源文件中而不是标题中。您只需在一个地方更改值。一个常量有两个名称。当然,在使用多个文件中定义的常量的场景中,您必须可以访问这些源文件的#define。

答案 1 :(得分:4)

我对你的问题的第一反应是一个回答的问题 - 事实上你想在多个名字下有一个常数,这个指标是常数的名称首先需要重新思考吗?

答案 2 :(得分:2)

在代码中分配字符串常量:

//Constants.h
extern NSString * MyConstant;
extern NSString * MyOtherConstant;
void setUpConstants();

//Constants.m
NSString * MyConstant;
NSString * MyOtherConstant;
NSString * const ValueOfString = @"A Value";
void setUpConstants()
{
    MyConstant = ValueOfString;
    MyOtherConstant = ValueOfString;
}

如果编译器不保护它们不受修改,则有一个缺点。但是初始化非常灵活,您可以改进其他代码。您还可以保证字符串的不同地址,无论编译器是否决定折叠是本周的功能。