我有一个处理时间的应用。我只想在整个项目中指定一分钟一秒钟的秒数。事实上,作为一个原则问题,我希望我的应用程序二进制文件尽可能少地拥有此数据的冗余副本(因此定义是最后的手段)。天真的我试试这个:
// 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"
const定义中出现timeout
错误。
我会避免重述我所追逐的所有红色鲱鱼的故事,寻找解决这个问题的方法(谷歌充满了这些,但没有实际答案)。相反,我只是简单地说:是否可以在目标c中引用另一个文件的const中的const?
更新
为了解决'it should work'样式答案,我使用上面的代码创建了simple sample project on github。需要进行一个小的修改(timeout
const重命名为timeoutSeconds
)。该项目是在Xcode 5.0中创建的一个空iOS项目,其中添加了appConstants
和viewController
文件,如上所述(上述const重命名除外)。
答案 0 :(得分:0)
// appConstants.h
#ifndef appConstants
#define appConstants
uint const SecondsInMinute = 60u;
#endif
// viewController.m
#import "appConstants.h"
uint const timeout = SecondsInMinute;
答案 1 :(得分:0)
使用函数:
uint timeout() {return SecondsInMinute;}
当需要编译时常量时,或enum
(在标题中):
enum { SecondsInMinute = 60 };
答案 2 :(得分:0)
这不是问题。你应该深呼吸,然后回到一些真正的工作中。
您似乎认为const
变量有一些特殊之处。没有。它们是任何其他变量的变量。它们不是“编译时常量”,因为您的评论表明您认为它们是。它们是普通变量,以普通方式在运行时设置。 const
是编译器的一个提示,它可能希望以特殊方式存储此值,因为它保证不会更改,但编译器没有义务专门处理该值。所以你并没有为自己做任何特别好的担心。甚至不清楚为什么在代码中使用const
。您似乎对“效率”感到担忧,但您认为这意味着什么或const
如何有效并不明显。 #define
在某种意义上肯定是有效的:它是完全内联的:它是在编译器发挥作用之前执行的文本替换。
你评论中另一个有启发性的段落是“我不太了解C”。这很清楚。我强烈建议您在关注自己之前至少停下来阅读Kernighan和Ritchie的相关段落。我还建议你阅读这个问题: