[解決済み] Objective-Cにおける#defineとconstの比較
疑問点
私はObjective-Cの初心者ですが、以下の点についていくつか質問があります。
const
とプリプロセッシングディレクティブである
#define
.
まず、定数の型を定義するために
#define
. なぜでしょうか?
次に、どちらか一方を使うことで何か利点があるのでしょうか?
最後に、どちらの方法がより効率的で、より安全なのでしょうか?
どのように解決するのですか?
<ブロッククオートまず、#defineを使って定数の型を定義することができないことがわかりました。
なぜかというと、何が? そんなことはないですよ。
#define MY_INT_CONSTANT ((int) 12345)
次に、どちらか一方を使うことの利点は何ですか?
はい、あります。
#define
は、コンパイルが始まる前でも置換されるマクロを定義します。
const
は単に変数を変更しようとするとコンパイラがエラーになるように変数を変更します。 を使うことができるコンテキストがあります。
#define
を使うことができるコンテキストがありますが
const
(を使うことはできません(最新のclangを使って苦労していますが)。 理論的には
const
は実行ファイルにスペースを取り、メモリへの参照を必要としますが、実際にはこれは重要ではなく、コンパイラによって最適化されるかもしれません。
const
よりもはるかにコンパイラやデバッガに優しいです。
#define
s. ほとんどの場合、どちらを使用するかを決定する際には、この点を優先して考慮すべきです。
を使うことができるコンテキストを思いついただけです。
#define
が使えるが
const
. もし、たくさんの
.c
ファイルで使いたい定数がある場合
#define
ではヘッダに貼り付けるだけです。 ヘッダには
const
では、C ファイルに定義があり
// in a C file
const int MY_INT_CONST = 12345;
// in a header
extern const int MY_INT_CONST;
をヘッダに入れる。
MY_INT_CONST
は、定義されているファイル以外のCファイルでは、静的またはグローバルスコープの配列のサイズとして使用することはできません。
しかし、整数の定数に対しては
enum
. 実際、Appleはほとんどいつもそうしています。 これは
#define
と
const
がありますが、整数の定数に対してのみ動作します。
// In a header
enum
{
MY_INT_CONST = 12345,
};
最後に、どちらの方法がより効率的で、かつ/またはより安全なのでしょうか?
#define
は理論的にはより効率的ですが、私が言ったように、最近のコンパイラはおそらくほとんど差がないことを保証しています。
#define
に代入しようとすると常にコンパイラーエラーになるという点で、より安全です。
#define FOO 5
// ....
FOO = 6; // Always a syntax error
const
は、コンパイラが警告を発するかもしれませんが、騙されて代入される可能性があります。
const int FOO = 5;
// ...
(int) FOO = 6; // Can make this compile
プラットフォームによっては、定数が読み取り専用セグメントに配置されている場合、実行時に割り当てが失敗する可能性があり、これはC標準によると公式に未定義の動作です。
個人的には、整数の定数については、常に
enum
を、それ以外の型の定数には
const
を使います。
関連
-
[解決済み] Objective-CでNSStringsを連結するためのショートカット集
-
[解決済み] Objective-Cの定数
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] Static readonly」対「const」。
-
[解決済み】"static const" vs "#define" vs "enum"
-
[解決済み] [Objective-Cの@propertyのretain, assign, copy, nonatomicについて。
-
[解決済み】PHP|define() vs. const.
-
[解決済み] Objective-C の boolean の書式設定文字列?
-
[解決済み] BOOLのデフォルト値
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Objective-Cで定数を作成する最も良い方法は何ですか?
-
[解決済み] Objective-Cのクラス→文字列のようなものです。[NSArray className] -> @"NSArray" のようになります。
-
[解決済み] error: Writeable atomic property cannot pair with synthesized setter/getter and the user defined setter/getter.
-
[解決済み] NSPredicate: NSDateプロパティの日によるオブジェクトのフィルタリング
-
[解決済み] Objective-Cのセレクタ?
-
[解決済み] なぜObjective-Cはプライベートメソッドをサポートしないのですか?
-
[解決済み] switch文の中で変数を宣言する [重複]。
-
[解決済み] NSSetからNSMutableArrayを返す方法
-
[解決済み] Objective-Cでの文字列比較
-
[解決済み] Objective-CのReadonlyプロパティ?