我有以下代码
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
它没有任何警告就行了。
你知道这怎么可能发生?
答案 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}}永远不会是任何值,除非您尝试非常。