2

当我运行一些使用 extern 关键字来引用实现文件中的静态变量的代码时,我看到了一些奇怪的东西。所以我在我的实现文件中声明了静态变量 gCounter 并在同一个实现文件的两个方法中引用它(因为它是静态的)。但是,当我在方法中使用 extern 关键字时,会得到不同的结果。我的理解(通过阅读我的书)是,当您引用与方法在同一文件中声明的静态变量时,不需要 extern 。代码如下:

/** 界面 **/

#import <Foundation/Foundation.h>

@interface Fraction : NSObject

+(Fraction *) allocF;
+(int) count;

@end

/**implementation**/

#import "Fraction.h"

static int gCounter;

@implementation Fraction

+(Fraction *) allocF
{
    extern int gCounter;
    ++gCounter;

    return [Fraction alloc];
}

+(int)count
{
    extern int gCounter;
    return gCounter;

 }

@end

/**main**/
#import "Fraction.h"

int main (int argc, const char * argv[])
{

    @autoreleasepool
    {

    Fraction *a, *b, *c;

    NSLog(@"The number of fractions allocated: %i", [Fraction count]);

    a = [[Fraction allocF] init];

    b = [[Fraction allocF] init];

    c = [[Fraction allocF] init];


    NSLog(@"The number of fractions allocated: %i", [Fraction count]);

    }

    return(0);

}

当我在我的方法中使用 extern 关键字时,代码可以正常工作并导致打印整数 3。但是,当我删除 extern 时,会打印整数 2。这是为什么?由于 gCounter 是一个静态变量,如果没有 extern 关键字,这不应该工作吗?

4

1 回答 1

3

declaration您需要了解 a和 a之间的区别definition

  • static int x并且int x是定义。编译器为x.
  • extern int x另一方面是声明。你告诉编译器有一个在x别处定义的变量。

此外,您可以在不同的范围内定义具有相同变量名的不同变量:

int x = 0;
{
    int x = 1;
    NSLog(@"x = %d", x); // x = 1
}
NSLog(@"x = %d", x); // x = 0

所以如果你写

int x;
void foo() {
    int x;
    x++;
}

您正在增加函数 local x

int x;
void foo() {
    x++;
}

增加全局x

int x;
void foo() {
    extern int x;
    x++;
}

你需要声明extern int x你的定义x是否在另一个编译单元中,如果它在同一个编译单元中,最后两个是等价的。

于 2013-08-06T03:06:43.900 回答