代码之家  ›  专栏  ›  技术社区  ›  Jaysen Marais

是否可以引用目标c中另一个文件常量中的常量

  •  1
  • Jaysen Marais  · 技术社区  · 12 年前

    我有一个处理时间的应用程序。我只想在我的整个项目中指定一分钟有多少秒。事实上,原则上,我希望我的应用程序二进制文件具有尽可能少的数据冗余副本(因此定义是最后的手段)。我天真地这样做:

    // appConstants.h
    #ifndef appConstants
    #define appConstants
    extern uint const SecondsInMinute;
    #endif
    
    // appConstants.m
    #import "appConstants.h"
    uint const SecondsInMinute = 60u;
    
    // viewController.m
    #import "appConstants.h"
    uint const timeout = SecondsInMinute;
    

    这给了我一个 "initializer element is not a compile-time constant" 上的错误 timeout 常量定义。

    我将避免讲述我一直在寻找解决这个问题的方法的所有红色鲱鱼的故事(谷歌有足够多的这些,但没有实际的答案)。相反,我只简单地说:是否可以引用目标c中另一个文件常量中的常量?

    使现代化

    为了解决“应该有效”的问题,我创建了一个 simple sample project on github 具有上述代码。需要做一个小修改( 超时 常量重命名为 timeoutSeconds ). 该项目在Xcode 5.0中创建为空iOS项目 appConstants viewController 如上所述添加的文件(上述常量重命名除外)。

    3 回复  |  直到 12 年前
        1
  •  0
  •   justin    12 年前

    使用函数:

    uint timeout() {return SecondsInMinute;}
    

    enum (在标题中)当您需要编译时间常量时:

    enum { SecondsInMinute = 60 };
    
        2
  •  0
  •   Cy-4AH    12 年前
    // appConstants.h
    #ifndef appConstants
    #define appConstants
    uint const SecondsInMinute = 60u;
    #endif
    
    // viewController.m
    #import "appConstants.h"
    uint const timeout = SecondsInMinute;
    
        3
  •  0
  •   Community Mohan Dere    9 年前

    这不是问题。你可能应该深呼吸,然后重新开始真正的工作。

    你似乎觉得有什么特别的 const 变量。没有。它们和其他变量一样都是变量。它们并不像你的评论所说的那样是“编译时间常数”。它们是普通变量,集合 在运行时 以普通的方式。 常量 是对编译器的提示,它可能希望以特殊方式存储此值,因为它保证不会更改,但编译器没有义务专门处理该值。所以你担心它并没有给自己带来什么特别的好处 常量 在你的代码中。你似乎对“效率”感到担忧,但你认为这意味着什么或如何 常量 高效。 #define 在完全内联的意义上,它当然是有效的:它是在编译器开始使用之前执行的文本替换。

    你评论中的另一段话是“我对C不够了解”。这很清楚。我强烈建议你停下来,在谈论这类事情之前,至少阅读一下柯尼汉和里奇的相关段落。我还建议您阅读以下问题:

    #define vs const in Objective-C