1. ホーム
  2. objective-c

[解決済み] Objective-Cにおける#defineとconstの比較

2023-07-03 04:35:17

疑問点

私は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はほとんどいつもそうしています。 これは #defineconst がありますが、整数の定数に対してのみ動作します。

// 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 を使います。