Ios 头文件中定义的静态bool仅适用于一个文件,为什么?
我是Objective-C的新手 我尝试集成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
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