がどのような目的は、constキーワードを使用するCのための変数には?
https://softwareengineering.stackexchange.com/questions/204500
-
29-09-2020 - |
質問
がつにちが 私のコードの見直しこちら 使用問題の 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);
...
}
変更した場合は str
へ const
, しなければなしを fuction_b
も
a const
.い場合 function_b
過去におい str
へ function_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
を参考に別のものです。