首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >静态const与外部const有什么不同?

静态const与外部const有什么不同?
EN

Stack Overflow用户
提问于 2014-12-11 00:08:30
回答 3查看 2.2K关注 0票数 5

在我的iOS/Objective项目中,我经常使用API键之类的常量.h文件。直到今天,我一直将常量声明为static const,如下所示:

代码语言:javascript
复制
static NSString * const kAPIKey = @"wembvkejrvb43789gvbiu2bvfake";

这很好,但不幸的是,我只能为原语和文本创建常量。其他对象(如UIColor对象)不能存储在这个常量中,因为它们不能用静态字面语法初始化(我的理解,引用是必需的)。

在阅读了一些C++文档之后,我了解了一些事情:

  • static是不必要的,因为const是隐式静态的。
  • 调用NSString * const x实际上是在x中声明一个常量和不变的值。我不能更改该值,但可能能够更改x指向的值。
  • 此const具有内部链接,意味着该值是立即定义的(在编译时可以推定)。

这些结论正确吗?

extern const有何不同?我假设它们是外部链接的(因此是extern关键字)。它们是在运行时定义的吗?我可以创建某种动态extern const,它可以用类方法返回的值来设置吗?

例如,我希望创建一个包含UIColor值的全局范围的常量。我想使用[UIColor colorWithRed:green:blue:alpha:]类方法来构造这个颜色值。这显然不适用于我一直使用的内部链接常量(我假设这是因为它发生在编译时),但是是否可以使用外部常量,可能是在+initialize方法中设置的呢?

任何关于这种行为细节的阐述都会非常有帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-11 00:45:16

静态是不必要的,因为const是隐式静态的。

不,那不是真的。

static在文件作用域(即在任何方法或函数之外)使用时,意味着变量仅在该文件中可见。

extern意味着变量是在其他文件中定义的。

const意味着变量不能被修改。

考虑一下字符串。通常,您将有一个实现文件(名称以.m结尾),它定义了一些常量字符串指针:

代码语言:javascript
复制
NSString *const SomeString = @"some string";

您可能希望在其他文件中使用相同的常量。如果是这样的话,您可以将一个声明添加到标头(名称以.h结尾)文件中,向编译器解释变量是在其他地方定义的:

代码语言:javascript
复制
extern NSString *const SomeString;

这将允许您在导入头文件的任何文件中使用SomeString。另一方面,您可能会决定绝对不希望在实现文件之外使用常量。在这种情况下,您可以声明它为static (再次在实现文件中):

代码语言:javascript
复制
static NSString *const SomeString = @"some string";

这将阻止它在文件之外使用。

调用NSString * const x实际上是在x中声明一个常量和不变的值。我不能更改该值,但可能能够更改x指向的值。

对,它声明指针x是常量的--你不能改变它。如果它实际上是一个NSString,您也不能更改它所指向的值,因为实例NSString是不可变的。

此const具有内部链接,意味着该值是立即定义的(在编译时可以推定)。

我要看第五节--我不确定编译器是如何处理常量字符串的。不过,我认为使用它作为心智模型是安全的;在任何情况下,在代码使用字符串之前都会定义字符串。

票数 10
EN

Stack Overflow用户

发布于 2014-12-11 00:53:26

关于特定的编程问题,如何创建编译时定义的颜色对象:您不能,因为,除了语言提供文字语法的少数对象之外,对象是在运行时创建的。

但是您仍然可以在运行时优雅地完成它,而无需添加任何全局范围,就像sdk所做的那样.

代码语言:javascript
复制
@interface UIColor (RainbowAddition)

+ (UIColor *)chartruseColor;

@end

@implementation UIColor (RainbowAddition)

+ (UIColor *)chartruseColor {
    // bonus: this is really chartruse... according to the internet
    return [self colorWithRed:0.5 green:1.0 blue:0.0 alpha:1.0];
}

@end

http://cloford.com/resources/colours/500col.htm

票数 1
EN

Stack Overflow用户

发布于 2014-12-11 01:15:08

目的- C是C的纯扩展,C++不是.

在全球范围:

  • 在C(和目标-C)中,写const相当于extern const (外部链接);
  • 在C++中,const等同于static const (内部链接)。

在C(以及Objective)和C++中,要创建一个全局范围的const,您只需在一个源文件中定义它一次,比如extern const TYPE identifier = VALUE;,然后声明它(通常在头文件中),比如:extern const TYPE identifier; (读取它:我在全局链接级别的其他地方定义了这个const )。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27413196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档