2

我有如下代码

应用程序设置.h

FOUNDATION_EXPORT BOOL *const TEST_MODE;

应用程序设置.m

#ifdef DEBUG
BOOL *const TEST_MODE = YES;
#else
BOOL *const TEST_MODE = NO;
#万一

上面 .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;
#万一

它工作得很好,没有任何警告。

你知道这怎么会发生吗?

4

2 回答 2

3

你真的打算写一个值:

FOUNDATION_EXPORT const BOOL TEST_MODE;

…<code>BOOL 不是一个 objc 对象,它是一个signed char.

就错误而言,编译器会抱怨,因为您正在为指针值分配数值——其中只有0(aka NULL) 是编译器可以接受的,而任何其他数字 ( YESis 1) 都会产生错误/警告。

PS 只需使用bool.

于 2012-10-08T09:39:18.590 回答
1

只是为了更详细地解释:

不兼容的整数到指针的转换……</p>

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

… 初始化 ' BOOL *const' (aka ' signed char *const') …</p>

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

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

… 带有“signed char”类型的表达式;

在这种情况下,表达式是您声明中的初始化程序。这是您在声明的两个版本之间更改的部分:YES在一种情况下,NO在另一种情况下。

Objective-C 头文件定义NO为 0 和YES1,两者都强制转换为BOOL(如上所述,定义为signed char)。

所以:

  • 您的初始化程序是一个BOOL值(正如贾斯汀正确指出的那样,BOOL没有*),它是一个整数。
  • 您的变量包含一个BOOL *—a 指针。
  • 编译器不会让它飞,除非你非常明确地表明这是你想做的事情。
  • 即使您确实说服编译器同意这一点,它也不是正确的代码。

正如贾斯汀已经建立的那样,您应该省略*. 这会将变量声明为持有一个BOOL值,而不是一个指针。

我也支持他使用的建议bool。与 不同BOOL,abool永远不能是除true(1) 或false(0) 之外的任何值,除非您非常努力。

于 2012-10-08T16:14:36.257 回答