【问题标题】:Definition of static member in objective-C and objective-C++Objective-C 和 Objective-C++ 中静态成员的定义
【发布时间】:2012-07-05 22:59:46
【问题描述】:

我在编译objective-c源码和objective-c++源码的时候有区别。

这里是 test.h 中 Class1 和 Class2 的声明:

#import <Foundation/Foundation.h>

@interface Class1 {
}
@end

@interface Class2 {
}
@end

现在,这是 test.m 中的 Objective-C 实现:

#import "test.h"

@implementation Class1
/* static member */
static int mystatic;
@end


@implementation Class2
/* static member */
static int mystatic;
@end

我用这个命令编译成功了:

gcc -arch armv6 -isysroot /Developer/.../iPhoneOS5.0.sdk -x objective-c -c test.m

现在我完全使用了这个 Objective-C++ 实现 test.mm(完全相同的来源):

#import "test.h"

@implementation Class1
/* static member */
static int mystatic;
@end


@implementation Class2
/* static member */
static int mystatic;
@end

并使用此命令行进行编译(-x 选项不同):

gcc -arch armv6 -isysroot /Developer/.../iPhoneOS5.0.sdk -x objective-c++ -c test.mm

但我得到一个错误:

test.mm:11 error: redefinition if 'int mystatic'

为什么我在 ObjC++ 中而不是在 ObjC 中得到这个错误?

【问题讨论】:

  • +1 好问题!错误是正确的(static 是文件作用域,而不是类作用域)但是为什么 Objective-C 编译没有捕获到我无法理解...
  • 好的,那么,有没有办法声明一个静态成员类作用域?
  • Objective-C 中没有,除了为每个变量使用不同的名称。
  • 我不明白为什么有人会否决这个问题:我认为这是一个完全合法且非常有趣的问题,并以明确明确的方式陈述。
  • 请注意,Objective-C 既没有“成员变量”、“静态成员”也没有“类变量”。虽然“成员变量”和“实例变量”几乎相同,但坚持使用语言的词汇是有帮助的。

标签: objective-c static compilation objective-c++ redefinition


【解决方案1】:

这归结为 C 和 C++ 之间的区别。在 C 中,可以重新定义具有相同名称和相同类型的静态变量;在 C++ 中,这样做是错误的。

来自 C 标准:

具有文件范围但没有初始化程序、没有存储类说明符或具有存储类说明符 static 的对象的标识符声明构成暂定定义。 如果翻译单元包含一个或多个标识符的暂定定义,并且该翻译单元不包含该标识符的外部定义,则该行为与翻译单元包含该标识符的文件范围声明完全相同,带有翻译单元末尾的复合类型,初始化器等于 0。

来自 C++ 标准:

C.1.2, 3.1 更改:C++ 没有 C 中的“暂定定义”。例如,在文件范围内,

int i ;
int i ;

在 C 中有效,[但在 C++ 中无效。

就 Objective C 而言,该语言不支持在类级别作用域的变量;在 @implementation 块内声明 static int mystatic; 与在 @implementation 块外声明它的效果完全相同。要模拟类范围的变量,请在类方法中使用函数范围的静态变量。

【讨论】:

  • +1 所以想必如果使用-Wall,开发者会注意到这一点?
  • @trojanfoe 不,-Wall 不会警告您第二个定义,因为它不违反标准中规定的规则。
  • 感谢您的回答,太好了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 2013-04-11
  • 2011-06-18
  • 2010-10-31
  • 2011-04-01
  • 1970-01-01
相关资源
最近更新 更多