代码之家  ›  专栏  ›  技术社区  ›  Dave DeLong

其他名称的常量

  •  6
  • Dave DeLong  · 技术社区  · 15 年前

    首先,我看到 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 回复  |  直到 8 年前
        1
  •  6
  •   drawnonward    15 年前

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

    //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。

        2
  •  4
  •   drekka    15 年前

        3
  •  2
  •   Steve Weller    15 年前

    在代码中指定字符串常量:

    //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;
    }
    

    一个缺点是它们没有受到编译器的保护而不被修改。不过,初始化非常灵活,您可能可以改进其他代码。您还可以为您的字符串保证不同的地址,不管编译器是否决定折叠是本周的工作。