在Objective-C中,如何测试宏定义值?

时间:2012-08-17 01:56:23

标签: objective-c ios

我想用

#define IS_APP_FULL_VERSION NO

和代码

isAppFullVersion = IS_APP_FULL_VERSION;

设置实例变量。但是还有办法吗

#if IS_APP_FULL_VERSION == "NO"

// add some methods here

#endif

但它会产生编译错误,#if (IS_APP_FULL_VERSION == "NO")也是如此。有没有办法对YESNO进行检查? (检查替换值)


更新:似乎允许>== 0,例如

#if IS_APP_FULL_VERSION == 0

因此我们实际上可以将01用于false和true,并使用== 1进行测试,但如果YES和{{1}会更好可以使用。


更新2:

一种可能的解决方案是:

NO

一切正常,我们只需将#define IS_APP_FULL_VERSION 1 #if IS_APP_FULL_VERSION // add some methods here #endif isAppFullVersion = IS_APP_FULL_VERSION; 更改为1即可切换代码。

3 个答案:

答案 0 :(得分:1)

我认为,你是一些困惑的比较MACRO。

#define格式正在关注它。

#define MACRO_NAME VALUE VALUE空格也很好。MACRO_NAME需要的是。)

如果你想比较编译时跟它一样。这是比较仅表示definedno defined。不是YES vs NO

#define IS_APP_FULL_VERSION 1

#if defined IS_APP_FULL_VERSION
    NSLog(@"full-verison");
#endif

#define IS_APP_FULL_VERSION blahblah

#if defined IS_APP_FULL_VERSION
        NSLog(@"full-verison");
#endif

如果你想构建单独的版本。请参考以下内容。

#define IS_APP_FREE_VERSION

#if defined IS_APP_FREE_VERSION
     NSLog(@"free-version");
#endif

#define IS_APP_FULL_VERSION

#if defined IS_APP_FULL_VERISON
     NSLog(@"full-version");
#endif


如果您想要比较运行时跟随它。这通常是比较。

#define IS_APP_FULL_VERSION 1    

if(IS_APP_FULL_VERSION)
{
    NSLog(@"full-verison");
}

#define IS_APP_FULL_VERSION 0    

if(!IS_APP_FULL_VERSION)
{
    NSLog(@"no full-version");
}

答案 1 :(得分:0)

实际上,通常情况下,我会使用标志宏而不是值1,因为这里只有两种情况:

#define APP_IS_FULL_VERSION

定义或不定义该宏。然后,如果您以后想要根据它包含/排除代码,您可以使用:

#ifdef APP_IS_FULL_VERSION
    // Do something
#endif

(或#ifndef显然相反的情况)。

对于代码段,使用它来选择正确的代码是一件简单的事情:

#ifdef APP_IS_FULL_VERSION
    isAppFullVersion = YES;
#else
    isAppFullVersion = NO;
#endif

答案 2 :(得分:0)

您的基本问题是宏处理器#if语句只有一种数据类型 - 整数。所有#if表达式都以整数形式计算,未定义的符号将替换为零。无法计算字符串表达式(包括比较)。