【问题标题】:conditional compilation warning for constant常量的条件编译警告
【发布时间】:2013-02-15 17:00:23
【问题描述】:

问题

我只想在我的 TESTING 为 YES 时触发警告。这可能吗?我现在所拥有的不起作用。我该怎么办?

BOOL const TESTING = NO;
#if TESTING == YES
    #warning don't forget to turn testing to NO before upload
#endif

回答

根据下面的答案,这对我有用:

#define _TESTING // COMMENT THIS OUT TO DISABLE TESTING MODE
#ifdef _TESTING
    BOOL const TESTING = YES;
    #warning don't forget to turn testing to NO for production
#else
    BOOL const TESTING = NO;
#endif

【问题讨论】:

  • 是的,程序名称空间和宏名称空间完全不同。将程序值 TESTING 设置为 NO 对宏变量 TESTING 的值没有影响(尽管宏变量的值被替换为另一个方向,在实际编译器甚至看到程序之前的文本替换传递中)。
  • @HotLicks:所以如果他在程序中使用他的TESTING bool 来表示,显示警报视图或其他内容,他仍然需要保留BOOL const TESTING = NO; 以使程序代码识别它,对吗?所以他必须在发布时同时注释掉#define TESTING 并设置BOOL const TESTING = NO,对吗?
  • 他不应该将他的BOOL变量命名为TESTING,否则宏阶段会将其替换为NO,导致一些神秘的编译错误。因此,宏变量始终使用全部大写,程序变量永远不要全部使用大写。但他可以通过 ifdefs 或其他技术让宏变量 TESTING 控制他的 Testing 变量的设置。
  • 请注意,如上所述,使用全大写的程序变量名是个坏主意。
  • 杰克逊,你的回答很完美。谢谢。

标签: objective-c xcode cocoa constants definition


【解决方案1】:

尝试用

替换你所拥有的
#ifdef TESTING
  #warning //... warning here
  BOOL const testingBool = YES;
#else
  BOOL const testingBool = NO;
#endif

然后,您需要在 Target 的构建设置中将 TESTING 添加为“预处理器宏”(有关如何执行此操作的更多详细信息,请参阅this 问题)。

【讨论】:

  • 更好的是,在构建配置中定义TESTING,使其具有全局性并且易于更改。
  • @trojanfoe:感谢您的建议,已编辑答案(带有描述如何进行设置的链接)。
猜你喜欢
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多