2

次のようなコードがあります

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

警告なしで正常に動作します。

これがどのように起こるか考えていますか?

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… ' ' (別名 ' ')を初期化していますsigned char *const…</p>

これは、宣言した変数の型です。メッセージのこの部分が説明しているように、は(つまり、一方が他方に 'd される)BOOLとしても知られています。signed chartypedef

charは C の最小の整数型であるため、整数へのポインターを保持するためにこの変数を宣言しました。

… 'signed char' 型の式で;

この場合の式は、宣言の初期化子です。これは、宣言の 2 つのバージョン間で変更した部分です。YES一方の場合と他方の場合NOです。

Objective-C ヘッダーはNO0 および 1 として定義され、両方とも(上記のように として定義されます)YESにキャストされます。BOOLsigned char

そう:

  • あなたの初期化子はBOOL値です(ジャスティンが正しく指摘したようにBOOL、 no なしで*)、これは整数です。
  • 変数はBOOL *—a ポインターを保持します。
  • コンパイラは、これがあなたが意図していることであることを明確に示さなければ、これを飛ばしません。
  • コンパイラにこれに従うように説得したとしても、それは正しいコードではありません。

justin が既に確立しているように、*. BOOLこれにより、変数がポインターではなく値を保持していると宣言されます。

また、代わりに使用するという彼の提案を支持しboolます。とは異なり、非常にBOOL努力しない限り、aは(1) または(0)bool以外の値にはなりません。truefalse

于 2012-10-08T16:14:36.257 に答える