Objective c 是否可以引用另一个文件中的常量';目标c中的s常数

Objective c 是否可以引用另一个文件中的常量';目标c中的s常数,objective-c,constants,dry,Objective C,Constants,Dry,我有一个处理时间的应用程序。我只想在我的整个项目中指定一分钟内有多少秒。事实上,作为一个原则问题,我希望我的应用程序二进制文件有尽可能少的冗余副本这个数据(所以定义是最后的手段)。我天真地试着这样做: //appConstants.h #ifndef appConstants #定义appConstants 外部单位常数秒/分钟; #恩迪夫 //appConstants.m #导入“appConstants.h” 单位常数秒每分钟=60u; //viewController.m #导入“appC

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

//appConstants.h
#ifndef appConstants
#定义appConstants
外部单位常数秒/分钟;
#恩迪夫
//appConstants.m
#导入“appConstants.h”
单位常数秒每分钟=60u;
//viewController.m
#导入“appConstants.h”
uint常量超时=秒分钟;
这给了我一个
“initializer元素不是编译时常量”
关于
超时
常量定义的错误

我将避免重述我一直在寻找解决这个问题的方法的那些花言巧语(谷歌已经有足够多的花言巧语了,但还没有真正的答案)。相反,我只想简单地说:有可能引用另一个文件中目标c中的常量吗

更新

为了解决“it应该工作”风格的问题,我用上面的代码创建了一个。需要进行一个小的修改(
timeout
const重命名为
timeoutSeconds
)。该项目在Xcode 5.0中创建为一个空iOS项目,并如上所述添加了
appConstants
viewController
文件(上述常量重命名除外)。

使用以下函数之一:

uint timeout() {return SecondsInMinute;}
或者在需要编译时常量时使用
枚举(在标题中):

enum { SecondsInMinute = 60 };

这不是问题。你或许应该深吸一口气,然后重新开始真正的工作

您似乎认为
const
变量有一些特殊之处。没有。它们和其他变量一样都是变量。它们不是您的评论所说的“编译时常量”。它们是普通变量,在运行时以普通方式设置
const
提示编译器可能希望以特殊方式存储此值,因为它保证不会更改,但编译器没有义务特别处理此值。所以你担心这件事对自己没有什么特别的好处。甚至不清楚为什么要在代码中使用
const
。您似乎担心“效率”,但并不清楚您认为这意味着什么,也不清楚
const
的效率如何<代码>#define
在完全内联的意义上肯定是有效的:它是在编译器开始使用之前执行的文本替换

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


#在标题中定义SecondsInMinute 60u
,并在需要时导入标题;如果您在
.pch
文件中执行此操作,您甚至不需要导入它,因为它会在任何地方自动导入,或者只需删除麻烦行上的
常量
,或者使用一个向每个行分配相同值的单例方法client@matt我试图避免将定义为(在我有限的理解中,它只是在编译之前替换源代码中的值)。从
timeout
SecondsInMinute
定义中删除const都会导致
“初始值设定项元素不是编译时常量”
错误。使用单例方法来分配一个不变的变量似乎是浪费(从语言设计的角度来看,这是令人尴尬的)。我仍然不太明白为什么定义不好(特别是因为在这种情况下它只是一个标量),这似乎是一个显而易见的答案,但当我尝试它时,我会得到“复制符号”\u SecondsInMinute每个引用
appConstants.h的文件中都有生成错误
这就是#ifndef-#define卫士的作用。你确定你包括了它们吗?@Paul Jan Yep,肯定包括在内。问题可能过于简化了。实际的项目有数百个文件,每个控制器都可能最终导入appConstants.h很多times via#import statements in intermediate#imports。除此之外,appConstants文件实际上存在于子项目中。我讨论了是否在问题中提及这一点,但最后我选择了简单,并希望为一个看似简单的问题创建一个规范的答案(在另一个文件的const中引用const).Cy-4AH的答案暗示这是可能的,但由于我无法让它工作,我不能接受yet@JaysenMarais,我想您没有从appConstants中删除
uint const SecondsInMinute=60u;
。m@JaysenMarais并删除所有
extern uint const SecondsInMinute;
或改用新名称
SecondsInMinute
enum { SecondsInMinute = 60 };