objective-C和objective-C+中静态成员的定义+;

objective-C和objective-C+中静态成员的定义+;,objective-c,static,compilation,objective-c++,redefinition,Objective C,Static,Compilation,Objective C++,Redefinition,我在编译objective-c源代码和objective-c++源代码时有所不同 这里是test.h中Class1和Class2的声明: #import <Foundation/Foundation.h> @interface Class1 { } @end @interface Class2 { } @end 我使用此命令成功编译: gcc -arch armv6 -isysroot /Developer/.../iPhoneOS5.0.sdk -x objective-c

我在编译objective-c源代码和objective-c++源代码时有所不同

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

#import <Foundation/Foundation.h>

@interface Class1 {
}
@end

@interface Class2 {
}
@end
我使用此命令成功编译:

gcc -arch armv6 -isysroot /Developer/.../iPhoneOS5.0.sdk -x objective-c -c test.m
现在我使用的是this Objective-C++implementation test.mm(与源代码完全相同):

并使用此命令行编译(在-x选项中的差异):

但我有一个错误:

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

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

< P>这归结为C和C++的区别。在C语言中,可以用相同的名称和类型重新定义静态变量;在C++中,执行同样的操作是一个错误。 根据C标准:

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

< C++ >标准:

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

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


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

+1问得好!错误是正确的(
static
是文件作用域,而不是类作用域),但我无法理解为什么Objective-C编译无法捕获…好的,那么,有没有方法声明静态成员类作用域?不在Objective-C中否,除了为每个变量使用不同的名称之外。我不明白为什么会有人对这个问题投反对票:我认为这是一个完全合法且非常有趣的问题,用明确的术语表述。请注意,Objective-C既没有“成员变量”、“静态成员”也没有“类变量”。虽然“成员变量”和“实例变量”几乎相同,但坚持使用该语言的词汇表是有帮助的。+1因此,如果使用
-Wall
,开发人员会注意到这一点?@特洛伊木马否,
-Wall
不会警告您第二个定义,因为这不违反标准中规定的规则。谢谢你的回答,太好了!
#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.mm
test.mm:11 error: redefinition if 'int mystatic'
int i ;
int i ;