C++におけるconstと#defineの利害探求

14821 ワード

constとdefineの利害は、constの意味を導く.
constとdefineには似たような機能があります.それは「定数」を定義することです.
#define定義定数を置き換える方法を考えています.これはマクロを定義する方法です.マクロ置換定義定数には一定の欠陥があるため、タイプチェックを行わず、役割ドメイン制限がない(これにより後続の汚染が容易になる).
#include
#include
using namespace std;

void myfunc1() {
	#define a 10
}

void myfunc2() {
	printf("a=%d
"
, a); } int main() { printf(" :a=%d
"
, a); myfunc1(); myfunc2(); system("pause"); return 0; }

文字通りの直接置換のみを行うため、グローバルは有効であるため、定義がどこにあってもグローバルはアクセスできます.プリコンパイル時に置き換えられているので(定義があれば、プリコンパイル時にフルコース置き換えを行うので、外からもアクセスできます).
同時に、汚染されやすい.
#include
#include
using namespace std;

#define a 10

void myfunc1() {
	#define a 20
	printf("myfunc1   :a=%d
"
, a); } void myfunc2() { printf("myfunc2 :a=%d
"
, a); } int main() { printf(" :a=%d
"
, a); myfunc1(); myfunc2(); system("pause"); return 0; }

マクロ再定義のプロンプトが表示され、すべてが新しいものに変更されます.
マクロの方式はグローバル変数に相当し、関数内でも関数外でも名前を付けるときは丹念に彫らなければなりません(少し頭が痛いです).そうしないと、後で新しい関数の中でうっかり置き換えられやすくなります.これは、定数を定義するのに基本的にすべて大文字で、変数を小文字にすることで、マクロ名がどれだけあるか覚えていない以上、衝突することはありません.しかし、そのグローバル性は解決されていません.
constは役割域の制限があるため,グローバル変数を汚染する悩みを解決した.
次の手順はだめです.
#include
#include
using namespace std;

void myfunc1() {
	const int a = 20;
	printf("myfunc1   :a=%d
"
, a); } void myfunc2() { printf("myfunc2 :a=%d
"
, a); } int main() { printf(" :a=%d
"
, a); myfunc1(); myfunc2(); system("pause"); return 0; }

グローバルな読み取り専用変数を定義します.
#include
#include
using namespace std;

const int a = 10;
void myfunc1() {
	const int a = 20;
	printf("myfunc1   :a=%d
"
, a); } void myfunc2() { printf("myfunc2 :a=%d
"
, a); } int main() { printf(" :a=%d
"
, a); myfunc1(); myfunc2(); system("pause"); return 0; }

中のは外を邪魔しないし、優先度もあるし、同時に全体をしてもグローバルをしてもいいです.
このように新しく作った関数の中でaという名前を使いたいなら、何も考えずにそのまま使えばいい.以前外で定義されたグローバル変数aには影響しませんが、手間が省けるのではないでしょうか.
constは読み取り専用変数であり、本質的には変数であり、変数であればパラメータを渡すことができ、constはタイプチェックも行うため、パラメータを作ることで、異なるパラメータを受信することができ、より柔軟になるなどのメリットがあります.
あなたは中で私の変数を変えることができないでしょう.異なる変数を伝えることができます.そのため、もっと柔軟になったことを知っています.
#include
#include
using namespace std;

void myfunc1(const int k) {
	printf("myfunc1     =%d
"
, k); } int main() { const int a = 20; myfunc1(a); const int b = 30; myfunc1(b); system("pause"); return 0; }

constの応用:
読み取り専用変数であるため,外部の実パラメータが保護され,外部から実パラメータが伝達され,関数体では修正できない.そのため,外部の実パラメータに安全性を考慮させる.
#include
#include
using namespace std;

void myfunc1(const int* k) {
	*k = 3;
	printf("myfunc1     =%d
"
, k); } int main() { const int a = 20; myfunc1(&a); system("pause"); return 0; }

マクロ置換の方式はグローバル変数に相当し,汚染されやすく,役割ドメインの制限がなく,優先度の区別ができない.プリコンパイル時に置き換えられました.
constはコンパイル時に変数を割り当て、役割ドメインの区別があり、タイプと一致するセキュリティ検出があり、constを適用してプロジェクトを開発するのが便利で柔軟です...
マクロ置換は定数を定義し、必ずグローバルに有効である.
constは読み取り専用変数を定義し、役割ドメインの区分があり、グローバルでもローカルでも優先度の区分があります.便利で安全なので、defineの代わりになります.どうして存在するの?メリットもあるので、それぞれのメリットを取りたいだけです.
マクロ置換の方式は、コンパイルプロセス全体を遅くする(プリコンパイル時間+本格コンパイル時間)が、プログラムの実行速度を速くする.すでに直接置き換えられているので(マクロ展開)、直接実行すればよい.
constはそれに反してコンパイル時間全体が少ないが、メモリ領域を開く変数を探すため、プログラムの実行速度が遅くなった.