8

iOS アプリケーションのコードを arm64 用にコンパイルしているときに、カスタム Foundation 型のさまざまな基本型に関連する興味深い問題に直面しました。NSUIntegerとして宣言された数値をprintf(またはstringWithFormat)したいとします

[NSString stringWithFormat:@"%u", _depth,

NSUInteger は arm64 に対して unsigned long として宣言されているため、arm64 のコンパイル時に警告が生成されます。したがって、「%u」を「%lu」に置き換える必要がありますが、32 ビット アーキテクチャでは NSUInteger が unsigned int として宣言されているため、armv7(s) アーキテクチャ用にコンパイルすると無効になります。「NSUIntegerをフォーマット引数として使用しないでください」という警告が表示されることを認識しているので、フロートに進みましょう:

typedef CGFLOAT_TYPE CGFloat;

64 ビットではCGFLOAT_TYPEdoubleですが、32 ビットではfloatです。したがって、次のようにします。

- (void)foo:(CGFloat)value;

その後

[self foo:10.0f]; 
[self foo:10.0]; 

2 つのアーキテクチャー用にコンパイルすると、依然として警告が生成されます。32 ビット アーキテクチャでは、2 番目の呼び出しは正しくありません (double から float への変換)。64 ビット アーキテクチャでは、最初の呼び出しで float が double に変換されます (これは問題ありませんが、まだ良くありません)。

この問題についてのご意見をお待ちしております。

4

1 に答える 1