有什么方法可以使用预处理器检查语言变量是否存在?
Is there any way to check if a language variable exists using preprocessors?
我有这样的东西:
static NSString * const MyLogPrefixFormat = @"%@ - %@";
static NSString * const MyDefaultLogPrefix = @"MyApp";
#define MyLogSetPrefix(newPrefix) ; static NSString * const MyLogPrefix = newPrefix;
#define MyLogManualPrefix(messagePrefix, logMessage, args...) NSLog([NSString stringWithFormat:MyLogPrefixFormat, messagePrefix, logMessage], ##args);
#define MyLog(logMessage, args...) MyLogManualPrefix(MyLogPrefix, logMessage, ##args);
- (void)myMethod
{
MyLogSetPrefix(@"myMethod");
MyLog(@"Message One with args 1 (%@) and 2 (%@)", arg1, arg2);
MyLog(@"Message Two");
}
扩展为:
- (void)myMethod
{
static NSString * const MyLogPrefix = @"myMethod";
NSLog([NSString stringWithFormat:@"%@ - %@", MyLogPrefix, @"Message One with args 1 (%@) and 2 (%@)"], arg1, arg2);
NSLog([NSString stringWithFormat:@"%@ - %@", MyLogPrefix, @"Message Two"]);
}
不过,我也希望它这样做:
- (void)myMethod
{
MyLog(@"Message One", arg1, arg2);
MyLog(@"Message Two");
}
展开为:
- (void)myMethod
{
NSLog([NSString stringWithFormat:@"%@ - %@", MyDefaultLogPrefix, @"Message One with args 1 (%@) and 2 (%@)"], arg1, arg2);
NSLog([NSString stringWithFormat:@"%@ - %@", MyDefaultLogPrefix, @"Message Two"]);
}
为了实现第二个要求,我需要检查 MyLogPrefix
常量是否已设置。因为它是 static NSString * const
而不是 #define
,所以我不能使用 #ifdef
。 如何判断 MyLogPrefix
常量是否存在,如果不存在,使用 MyDefaultLogPrefix
?
在 .m 文件的顶部附近添加以下行(在任何方法之外):
MyLogSetPrefix(MyDefaultLogPrefix);
这将导致:
static NSString * const MyLogPrefix = @"MyApp";
被声明为文件全局变量。
现在,任何没有自己本地 MyLogSetPrefix
的方法都将使用这个全局文件。
我有这样的东西:
static NSString * const MyLogPrefixFormat = @"%@ - %@";
static NSString * const MyDefaultLogPrefix = @"MyApp";
#define MyLogSetPrefix(newPrefix) ; static NSString * const MyLogPrefix = newPrefix;
#define MyLogManualPrefix(messagePrefix, logMessage, args...) NSLog([NSString stringWithFormat:MyLogPrefixFormat, messagePrefix, logMessage], ##args);
#define MyLog(logMessage, args...) MyLogManualPrefix(MyLogPrefix, logMessage, ##args);
- (void)myMethod
{
MyLogSetPrefix(@"myMethod");
MyLog(@"Message One with args 1 (%@) and 2 (%@)", arg1, arg2);
MyLog(@"Message Two");
}
扩展为:
- (void)myMethod
{
static NSString * const MyLogPrefix = @"myMethod";
NSLog([NSString stringWithFormat:@"%@ - %@", MyLogPrefix, @"Message One with args 1 (%@) and 2 (%@)"], arg1, arg2);
NSLog([NSString stringWithFormat:@"%@ - %@", MyLogPrefix, @"Message Two"]);
}
不过,我也希望它这样做:
- (void)myMethod
{
MyLog(@"Message One", arg1, arg2);
MyLog(@"Message Two");
}
展开为:
- (void)myMethod
{
NSLog([NSString stringWithFormat:@"%@ - %@", MyDefaultLogPrefix, @"Message One with args 1 (%@) and 2 (%@)"], arg1, arg2);
NSLog([NSString stringWithFormat:@"%@ - %@", MyDefaultLogPrefix, @"Message Two"]);
}
为了实现第二个要求,我需要检查 MyLogPrefix
常量是否已设置。因为它是 static NSString * const
而不是 #define
,所以我不能使用 #ifdef
。 如何判断 MyLogPrefix
常量是否存在,如果不存在,使用 MyDefaultLogPrefix
?
在 .m 文件的顶部附近添加以下行(在任何方法之外):
MyLogSetPrefix(MyDefaultLogPrefix);
这将导致:
static NSString * const MyLogPrefix = @"MyApp";
被声明为文件全局变量。
现在,任何没有自己本地 MyLogSetPrefix
的方法都将使用这个全局文件。