簡體   English   中英

標頭中定義的靜態布爾僅適用於一個文件,為什么?

[英]static bool defined in header works for one file only, why?

我是Objective-C的新手

我嘗試集成asl_log 由於某些原因,靜態布爾在其他文件中始終NO值。

我創建了帶有內容的標頭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

您可以看到我將static bool gLoggingEnabled用作開關。

在主項目文件中,我執行以下操作:

#import "AFLogger.h"

// ...

gLoggingEnabled = YES;

if (gLoggingEnabled) {
    asl_add_log_file(NULL, STDERR_FILENO);
    //set log level
    asl_set_filter(NULL, ASL_FILTER_MASK_UPTO(ASL_LEVEL_DEBUG));
} else {
    asl_remove_log_file(NULL, STDERR_FILENO);
}  

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

但是,它僅在一個文件中起作用。

我還有其他.m文件:

 #import "AFLogger.h"

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

 // AFLogDebug prints nothing

為什么static bool gLoggingEnabled在其他文件中No

如何解決?

[編輯]

我想避免使用extern

這是static因此導入MyLogger.h每個.m文件都將獲得其自己的gLoggingEnabled變量副本。

如果您想要單個應用范圍的變量,則需要更改2項內容。

MyLogger.h您需要將static更改為extern

extern bool gLoggingEnabled;

MyLogger.m您需要添加:

bool gLoggingEnabled = NO;

該聲明與extern配對。 這是應用程序范圍的全局變量。

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

gLoggingEnabled = YES; // or NO as needed

最后一行將更改整個應用程序(任何包含MyLogger.h文件)的值。

您所擁有的是變量的定義。 您要的是聲明。 不僅如此, static修飾符還將其可見性限制在其定義的編譯單元中。實質上,每個.c.m文件都有其自己的gLoggingEnabled副本,只有它可以看到。

您需要做的是在一個.c.m文件中創建一個非靜態文件作用域變量

bool gLoggingEnabled = false; // Note, using C11 bool definitions

然后,您在標題中添加一個外部聲明。 這就像對編譯器的承諾,即您可能尚未在當前編譯單元中定義變量的存儲,但是將在鏈接時完成。

extern bool gLoggingEnabled;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM