预处理器语句的排序给了我警告?

时间:2012-10-08 09:34:12

标签: objective-c cocoa

我有以下代码

ApplicationSetting.h

FOUNDATION_EXPORT BOOL * const TEST_MODE;

ApplicationSetting.m

#ifdef DEBUG
BOOL * const TEST_MODE = YES;
 #else伪
BOOL * const TEST_MODE = NO;
 #ENDIF

上面的.m文件代码给了我这个警告

Incompatible integer to pointer conversion initializing 'BOOL *const' 
(aka 'signed char *const') with an expression of type 'signed char'; 

但是,如果我改变它就像这样来了

#ifdef DEBUG
BOOL * const TEST_MODE = NO;
 #else伪
BOOL * const TEST_MODE = YES;
 #ENDIF

它没有任何警告就行了。

你知道这怎么可能发生?

2 个答案:

答案 0 :(得分:3)

你真的打算写一个值:

FOUNDATION_EXPORT const BOOL TEST_MODE;

... BOOL不是objc对象,而是signed char

就错误而言,编译器会抱怨,因为您正在为指针值分配数值 - 编译器只接受0(aka NULL),以及任何其他数字( YES 1}将产生错误/警告。

P.S。只需使用bool

答案 1 :(得分:1)

只是更详细地解释一下:

  

不兼容的整数到指针转换...

您尝试将整数值(数字)转换为指针。这可以做到,但这通常是一个坏主意,因此需要高水平的显性。很难做到这一点(现在/在这个编译器上),并且有原因。

  

...初始化“BOOL *const”(又名“signed char *const”)...

这是您声明的变量类型。正如消息的这一部分所解释的那样,BOOL也称为signed char(即,typedef对另一个是char

YES是C中最小的整数类型,因此您声明此变量可以保存指向整数的指针。

  

...带有'signed char'类型的表达式;

本例中的表达式是声明中的初始值设定项。这是您在声明的两个版本之间进行更改的部分:在一个案例中为NO,在另一个案例中为NO

Objective-C标头将YES定义为0,将BOOL定义为1,两者都转换为signed char(如上所述,定义为BOOL)。

所以:

  • 您的初始值设定项为BOOL值(正如刚才指出的那样,*没有BOOL *),这是一个整数。
  • 您的变量包含* - 指针。
  • 如果你没有明确表示这是你想要做的事情,编译器就不会放手。
  • 即使您确实说服编译器继续使用它,也不会是正确的代码。

正如刚才已经建立的那样,你应该忽略BOOL。这会将变量声明为保持bool值,而不是指针。

我还提出了使用BOOL的建议。与bool不同,除true(1)或false(0)外,{{1}}永远不会是任何值,除非您尝试非常