C 中define乙個常量和const是否完全相同?

時間 2021-05-30 19:55:18

1樓:scientificworld

NO.#define是直接定義巨集,在預處理階段你如果看一下輸出檔案就會發現裡面肯定已經沒有乙個#define了,同時那些用到了這個巨集的地方也已經被替換掉了。(包括像#if,#ifdef,#ifndef,#else,#endif,#progma這些也沒了)

const是常量,不會被直接替換(至少預處理階段不會)。

而且,#define是可以用來定義除變數以外的其他東西的,比如這個:

#include

using

namespace

std;

#define 輸出 cout

#define 返回 return

intmain

()這些可不是變數。

相比來說,和#define最相近的命令排序是:typedef > constexpr > const

typedef基本就是用來專門定義型別的#define。

constexpr會在編譯期計算,至於會不會替換我就不知道了。

2樓:寒江雪

以我的淺薄的理解是這樣的,巨集定義是在詞法解析的時候文字替換,然後語法解析生成語法樹,然後編譯,編譯期constexpr和模板才開始落地。在11以及以後const的意義就完全的執行時,不再帶有constexpr的語義。

3樓:exiledkingcc

不一樣。define是在預編譯期進行替換,而const是在編譯器處理。因此會有很多不同,比如:

1,const可以有型別。比如

const uint8_t A = 0xff;

和#define A 0xff

對於++A來說結果不一樣。

const還可以像這樣:const vector V= ;

而define V 是什麼東西就不一定了。

2,const可以取位址和傳遞引用,define不行。

3,const受限於命名空間。比如:

namespace N {

const int A = 1;

#define B 1

int A2 = A + 1; // compile errorint B2 = B + 1; //ok

4樓:望山

不是完全相同,而是完全不同。

你可以寫

const int x=1;

*reinterpret_cast(&x)=2;

C++當年規定const可以當常數用來定義陣列大小,那是有邏輯漏洞的,是當年盡量不增加關鍵字的設計原則下的無奈之舉。constexpr就是用來補這個漏洞。

為什麼常量指標必須用乙個非常量的位址初始化

黃達 inta 1 int constb a 這個b是乙個 指標常量 它指向的位址被理解為int型別。它可用int型別的變數 非常量 的位址來初始化。const inta 1 const int b a 這個b是乙個 常量指標 指向的位址被理解為const int型別的位址。它可用乙個const i...

java和c中每乙個case都要寫break是不是設計缺陷?

C這些明顯就是 為了讓人類寫彙編 的特性其實沒啥,值得吐槽的是方程一樣的型別宣告 而且 C 偏偏是乙個沒啥抽象的語言,需要抽象的地方只好函式指標和void 滿天飛,這就讓型別宣告的問題更加明顯了 SuperFashi 我覺得也是設計缺陷,至少不現代。而且C C 的switch還只能搞int型別,感覺...

乙個關於 C 中 name hiding (隱藏)的描述的句子的理解問題。

Alex 帶著對題主的膜拜心裡,想知道題主被什麼技術問題難住了,點進來卻發現這是個關於的英語的問題!以下是 牛津英語詞典 OED 的附加解釋 Different from,different than,and different to are there any distinctions betwe...