extern但是静态int?

时间:2013-08-27 05:07:05

标签: objective-c magicalrecord

我在我的项目中使用了MagicalRecord + CocoaLumberjack。 Magical record以下列方式声明ddLogLevel(调试/日志记录级别):

extern int ddLogLevel

这意味着我必须稍后自己声明这个变量,我这样做。

现在,查看Lumberjack的文档(https://github.com/robbiehanson/CocoaLumberjack/wiki/DynamicLogLevels)我想将此变量声明为静态,以便我可以动态地更改类级别的调试级别。 如果我在ddLogLevel中将AddDelegate声明为静态int,则编译器会抱怨(静态声明遵循非静态声明),这是有道理的,但我应该如何将其声明为静态?

我能够让这个工作的唯一方法是在ddLogLevel中将AppDelegate声明为常规int,然后在类中我想要一个不同的日志级别我再次声明变量,但只在我的界面中声明:

@interface MyClass () {
    int ddLogLevel;
}

这很有效,但是如果我能将ddLogLevel声明为静态的话会很棒...有一个特定的地方我可以将它声明为静态并通过不必每次都声明它来简化我的调试我想动态更改调试级别吗?

3 个答案:

答案 0 :(得分:2)

在您的ddLogLevel.m.c文件中,在文件范围内(任何类外)定义.mm,完全如下:

int ddLogLevel = 0;

要为其指定新值,请使用类似的内容(在函数内):

ddLogLevel = 2;

不要担心“静电”;在尝试任何想象之前,先了解基础知识。

答案 1 :(得分:0)

正确的做法是将变量声明为static,而不是extern。 我在 .pch 文件中执行此操作并添加pragma以禁止警告:

#ifdef __OBJC__
    #import <Cocoa/Cocoa.h>
    // ...
    static int ddLogLevel = LOG_LEVEL_WARN;
    #pragma unused(ddLogLevel)
#endif

然后,as suggested by @Quuxplusone,我可以为其指定一个新值:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    ddLogLevel = LOG_LEVEL_VERBOSE;
    // ...
}

答案 2 :(得分:0)

要启用动态更改ddLogLevel我正在使用以下方法:

在一个标头文件(.h)中,我在extern DDLogLevel ddLogLevel;范围之外定义了@interface。在实施文件(.m)中,我在DDLogLevel ddLogLevel;范围之外再次定义了extern而没有@implementation关键字。多亏了这一点,我可以在任何地方动态更改或设置ddLogLevel