首先,我看过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
这样的东西之外,我能在多个名字下提供一个常量吗?
答案 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;
}
如果编译器不保护它们不受修改,则有一个缺点。但是初始化非常灵活,您可以改进其他代码。您还可以保证字符串的不同地址,无论编译器是否决定折叠是本周的功能。