Ios 头文件中定义的静态bool仅适用于一个文件,为什么?

Ios 头文件中定义的静态bool仅适用于一个文件,为什么?,ios,objective-c,Ios,Objective C,我是Objective-C的新手 我尝试集成asl\u log。由于某些原因,静态bool在其他文件中总是有无值 我创建了标题MyLogger.h,内容如下: #import <Foundation/Foundation.h> #import <asl.h> static bool gLoggingEnabled = NO; #define __AF_MAKE_LOG_FUNCTION(LEVEL, NAME) \ static inline void NAME(NS

我是Objective-C的新手

我尝试集成
asl\u log
。由于某些原因,静态bool在其他文件中总是有

我创建了标题
MyLogger.h
,内容如下:

#import <Foundation/Foundation.h>
#import <asl.h>

static bool gLoggingEnabled = NO;

#define __AF_MAKE_LOG_FUNCTION(LEVEL, NAME) \
static inline void NAME(NSString *format, ...)\
{ \
  if (!gLoggingEnabled) return; \
  va_list arg_list; \
  va_start(arg_list, format); \
  NSString *formattedString = [[NSString alloc] initWithFormat:format arguments:arg_list]; \
  asl_add_log_file(NULL, STDERR_FILENO); \
  asl_log(NULL, NULL, (LEVEL), "Prog_ASL:  %s", [formattedString UTF8String]); \
  va_end(arg_list); \
}    

__AF_MAKE_LOG_FUNCTION(ASL_LEVEL_DEBUG, AFLogDebug)



#undef __AF_MAKE_LOG_FUNCTION
但是,它只能在一个文件中工作

我有其他
.m
文件:

 #import "AFLogger.h"

 //...
 NSLog(@"flag is %@", gLoggingEnabled ? @"Yes" : @"No");
 // -> flag is No

 // AFLogDebug prints nothing
为什么
静态bool glogginabled
在其他文件中有

如何修复它

[编辑]


我希望避免使用
extern

它是
静态的
,因此导入
MyLogger.h
的每个.m文件都有自己的
glogginabled
变量副本

如果你想要一个应用程序范围的变量,那么你需要改变两件事

MyLogger.h
中,您需要将
static
更改为
extern

extern bool gLoggingEnabled;
MyLogger.m
中,您需要添加:

bool gLoggingEnabled = NO;
该声明与
extern
配对。这是应用程序范围的全局变量

然后,您可以在任何文件中更改其值:

gLoggingEnabled = YES; // or NO as needed

最后一行将更改整个应用程序(包括
MyLogger.h
的任何文件)的值。

它是
静态的
,因此导入
MyLogger.h
的每个.m文件都有其自己的
glogingEnabled
变量副本

如果你想要一个应用程序范围的变量,那么你需要改变两件事

MyLogger.h
中,您需要将
static
更改为
extern

extern bool gLoggingEnabled;
MyLogger.m
中,您需要添加:

bool gLoggingEnabled = NO;
该声明与
extern
配对。这是应用程序范围的全局变量

然后,您可以在任何文件中更改其值:

gLoggingEnabled = YES; // or NO as needed

最后一行将更改整个应用程序(包括
MyLogger.h
的任何文件)的值。

这里有一个变量的定义。你想要的是一份声明。不仅如此,
static
修饰符还将其可见性限制在定义它的编译单元中。基本上,每个
.c
.m
文件都有自己的
glogginabled
副本,只有它才能看到

您需要做的是在一个
.c
.m
文件中创建一个非静态文件范围变量

bool gLoggingEnabled = false; // Note, using C11 bool definitions
然后在标题中添加一个外部声明。这就像向编译器承诺,您可能没有在当前编译单元中定义变量的存储,但将在链接时完成

extern bool gLoggingEnabled;

这里有一个变量的定义。你想要的是一份声明。不仅如此,
static
修饰符还将其可见性限制在定义它的编译单元中。基本上,每个
.c
.m
文件都有自己的
glogginabled
副本,只有它才能看到

您需要做的是在一个
.c
.m
文件中创建一个非静态文件范围变量

bool gLoggingEnabled = false; // Note, using C11 bool definitions
然后在标题中添加一个外部声明。这就像向编译器承诺,您可能没有在当前编译单元中定义变量的存储,但将在链接时完成

extern bool gLoggingEnabled;

那么为什么Mixpanel使用
static
?使用
static
允许每个文件(.m)为自己打开或关闭日志,而不影响其他文件的选择。此外,我没有
.m
文件和MixPanel调用20-30个文件中的
MPLogError
,我不知道为什么它们不使用
extern
,那么为什么MixPanel使用
static
?使用
static
允许每个文件(.m)为自己打开或关闭日志,而不影响其他文件的选择。此外,我没有
.m
文件和20-30个文件的MixPanel调用
MPLogError
,我不知道它们为什么不使用
extern