【问题标题】:extern but static int?外部但静态int?
【发布时间】:2013-08-27 05:07:05
【问题描述】:

我在我的项目中使用 MagicalRecord + CocoaLumberjack。 神奇的记录通过以下方式声明ddLogLevel(调试/日志级别):

extern int ddLogLevel

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

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

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

@interface MyClass () {
    int ddLogLevel;
}

这可行,但如果我可以将ddLogLevel 声明为静态,那就太好了...是否有一个特定的地方我可以将它声明为静态并通过不必每次都声明它来简化我的调试想要动态更改调试级别?

【问题讨论】:

    标签: objective-c magicalrecord


    【解决方案1】:

    在文件范围内(在任何类之外),在您的 .m.c.mm 文件之一中定义 ddLogLevel,就像这样:

    int ddLogLevel = 0;
    

    要为其分配新值,请使用以下内容(在函数内部):

    ddLogLevel = 2;
    

    不用担心“静态”;在你尝试任何花哨的东西之前先了解基础知识。

    【讨论】:

      【解决方案2】:

      正确的做法是将变量声明为static,而不是extern。 我在 .pch 文件中执行此操作并添加一个编译指示来抑制警告:

      #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;
          // ...
      }
      

      【讨论】:

        【解决方案3】:

        为了启用ddLogLevel 的动态更改,我使用以下方法:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-16
          • 1970-01-01
          • 2011-03-10
          • 2021-11-28
          • 2012-05-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多