質問

がつにちが 私のコードの見直しこちら 使用問題の const キーワードになってしまうのです。私の理解で使用されることの実施のための読み取り専用の行動上の変数.

私は戸惑いので、様々なことができる場合に便利です。

  • であると考えられる使用のための透明性の高機能試作か?
  • そのとして使用するセキュリティ対策の中でコード開発?
  • されているべきで、適切な使用の範囲の様々な機能を宣言する実行時定数?
  • それは全くないのでしょうか。

これらの問題はイメージとなりの混乱がっています。一般に混乱

  • が必要に const キーワードの使用にCプログラミング?
  • どの各種特典を得ることができるキーワード。
  • ある利用 const キーワード?


され続けていることすることがありますの範囲が広すぎて、コミュニティにこれらの問題に私の質問です。そう思ってやってきましたことを明らかにこれらの問いかを明らかに混乱に関する主な質問です。

がどのような目的は、constキーワードを使用するCのための変数には?

することもできと言い換え

の適切な利用に関す const キーワードC`の是非に同じです。

役に立ちましたか?

解決

検証コードを申し込みは、以下のルール:

  • 常に使用 const 機能に渡されたパラメータを参考に 機能は変更が行えない状態になり(無料)のデータを指摘。

    int find(const int *data, size_t size, int value);
    
  • 常に使用 const のための定数はそれを使用して定義される#defineまたはenum.のコンパイラでの検索、データの読み取り専用メモリの(ROM)結果としては、リンカーすることは、多くの場合、よりよいツールこの目的のためには、組み込みシステム).

    const double PI = 3.14;
    
  • 使用しなconstに機能 試作 のためのパラメータに渡される .せなければ意味があるだけのノイズ'.

    // don't add const to 'value' or 'size'
    int find(const int *data, size_t size, int value); 
    
  • 適切な場合には、利用 const volatile 場所を変更できませんのプログラムでも変化します。ハードウェア登録は、典型的な利用の場合ここで、例えば登録状況を反映した装置の状態:

    const volatile int32_t *DEVICE_STATUS =  (int32_t*) 0x100;
    

その他の使用は任意となっております。例えば、パラメータ関数の機能 実施 を行うことが可能でconst.

// 'value' and 'size can be marked as const here
int find(const int *data, const size_t size, const int value)  
{
     ... etc

または関数の戻り値または計算が得られた後に変更できません:

char *repeat_str(const char *str, size_t n) 
{
    const size_t len = strlen(str);
    const size_t buf_size = 1 + (len * n);
    char *buf = malloc(buf_size);
    ...

これらの利用 const いただくだけですませんので変更は、変数;な変化をどのように変数が格納されています。のコンパイラでのコースワークと変数は変更されませんが、追加 const すでに実施する。ことができるリーダーズドプラットフォームの安全性がご機能を大 複雑ないことには大きな違いが、間違いその他の 問題があります)。 編集-eg.200線を高密度に分け機能との入れ子ループと多くの長 または類似の変数名であることを知りなが特定の変数は変わらないもの やunderstaningできます。などの機能をひどく設計し又は maintened.


の問題 const.おそらく聞く、"const中毒".この時の追加 const 関数にパラメータの原因'constnessへ 増殖する。

編集-const中毒:例えば、機能:

int function_a(char * str, int n)
{
    ...
    function_b(str);
    ...
}

変更した場合は strconst, しなければなしを fuction_b も a const.い場合 function_b 過去におい strfunction_c, など。想像がつくと思いますがこれは痛いが伝搬する多くの 個別のファイル/モジュールです。場合に伝搬し機能できない 変更(例えばシステム図書館、キャストが必要になります。く散 const 周辺には、既存のコードがかかります。新しいコード もので const 合一貫して適切な場合

の陰湿な問題の const はないということであったの 言語です。もちろんのこと、わずらわしいではないか。スタートにおいて最も手間のかかる意味 (上記の規則"という意味じゃなく、今後どこへ向かおうとしているこの"や"ここで改変を行うことはできません").あるいはそれ以上にできるので危険です。例えば、コンパイルおよび このコードによるコンパイラ/オプション)でもクラッシュの場合 実行します:

const char str[] = "hello world\n";
char *s = strchr(str, '\n');
*s = '\0';

strchr を返します char* りません const char*.その通話のパラメータ constキャスト のパラメータ char*.この場合と かぶ離れの読み取り専用の保管物件です。 編集:-これはvarsに読み取ります。によるROMというのは、な物理ROMがるメモリの書込み保護し、そのコード部のプログラム実行の代表的なOS.

多くの標準ライブラリの機能の動作と同じなので注意:き してい 定数(ie.保存されROM)だけないよう十分ご注意ください そconstness.

他のヒント

一般的に他のプログラミング言語、その使用を推奨 const 又はこれと同等の修飾ら

  • でき道を明らかにすることができるの呼び出し側から渡されたとは---
  • 潜在速度の改善からコンパイラするために知っておきたいあるいは省略可能であることだけに該当する場合のパラメータを変更できる
  • からの保護を自分で偶然の値を変更する

合TheLQの諸表の作成に

場合、どのチームのプログラマーを宣言する const よりもすることができることを示すと変数だけをすることができるものとんチに自分自身の大きます。便利であるとはいえるでしょうそういう意味で、保存でき、また多くのります。

そう、基本的にTheLQの答えです。

セキュリティ対策のためのプログラマでない変数をませ------------機能を変更することがあります。配列や構造の定数指定子を示し、値がその内容についをすることができるものとともにコンパイラすることはできません。今でも同じことは可能ですが簡単に変数の値だけでキャストしています。

にとっては、通常、これは、主を付加するために使われる定数値コードを提示することを、配列、構造な修正することにお問い合わせいただいた場合、特定の機能です。この最後の部分が重要ですがご利用いただきますと、数変更の配列や構造にする必要がありますのでなく,実際のアプリケーションで作成するコピーの変数として渡します。場合ですが、実はそうではありません、必要としないコピーのことは明らかであり、たとえば、変更可能

int foo(Structure s);

int foo(const Structure * s);

やが得られないコピーオーバーヘッド。

るだけで追加、ご注意Cは、特定の規則の定数指定子.例えば、

int b = 1;
const int * a = &b;

と同じではない

int b = 1;
int * const a = &b;

最初のコードでは迅速な対応で日まで修正.第二の場合、ポインタが一定ではなく、その内容は、コンパイラによっ * a = 3; なコンパイラエラーができなく a を参考に別のものです。

ライセンス: CC-BY-SA帰属
所属していません softwareengineering.stackexchange
scroll top