預處理與const

2021-06-19 14:26:45 字數 1159 閱讀 7167

1.1 巨集定義

例題1:用預處理指令#define 宣告乙個常數,用以表明1年中有多少秒(忽略閏年問題)。

解析:#defne 語法的基本知識(如:不能以分號結束,括號的使用)

要懂得預處理器將為你計算常數表示式的值,因此,寫出你是如何計算一年中有多少秒而不是計算出實際的值,會更有意義。

最重要的是,意識到這個表示式將使乙個16位機的整型數溢位,因此要用到長整型符號l,告訴編譯器這個常數是長整型數。

答案:#define seconds_per_year  (60*60*365)ul

例題2:寫乙個「標準」 巨集 min ,這個巨集輸入兩個引數並返回較小第乙個。

解析:操作符存在c語言的原因是它使得編譯器能產生比 if-then-else 更優化的**,這對於嵌入式系統來說,為了達到要求的效能,潛入**經常是必須的方法。最重要的一點是,懂得在巨集中小心地把引數用括號括起來。

答案:#define min(x,y) ((x) <= (y) ? (x) :(y))

1.2 const 

例題1:const 有什麼用途?

答案:(1)可以定義 const 常量。(2)const 可以修飾函式的引數和修飾函式返回值,在c++中還可以修飾定義體,定義類中某個成員函式為恆態函式,即不改變類中的資料成員。被const修飾的東西都受到強制保護,可以預防意外的變動,提高程式的健壯性。

例題2:  const 與 #define 相比有什麼不同?

答案:(1)const 常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全性檢查,而對後者只是進行字元 替換,沒有型別安全檢查,並且在字元替換中可能會產生意想不到的錯誤(如:邊際效應)。

(2) 有些整合化的除錯工具可以對 const 常量進行除錯,但是不能對巨集常量進行除錯。在c++ 程式中,只能使用 const 常量而不能使用巨集常量,即 const 常量完全取代巨集常量。

擴充套件知識:

c語言中的const 的意思是「乙個不能被改變的普通變數」,在c中,它總是占用記憶體,而且它的名字是全域性符。c編譯器不能把 const 看成乙個編譯期間的常量,如下面是不對的。

const bufsize = 100;

char buf[bufsize];

儘管看起來好像做了一件合理的事情,但是這將得到乙個錯誤的結果。因為 bufsize 占用記憶體的某個地方,所以編譯器不知道它在編譯時的值。

預處理 const 與 sizeof

程式設計師面試寶典 第二版筆記 巨集定義1.用乙個巨集定義find求乙個結構體struct裡任意變數相對struct的偏移量 struct student 則find student,a 等於0 find student,b 等於4 答 define find struc,e size t stru...

預處理 const與sizeof

本文 第六章 預處理 const與sizeof 1.預處理當中的巨集定義 注意 有時候巨集展開以後會出現二意性問題。所以要注意使用括號。2.sizeof的總結 sizeof是運算子,它的作用是返回乙個型別或變數的長度,長度的單位是位元組。1 基本資料型別sizeof的結果 平台 windows xp...

預處理 const與sizeof

程式設計師面試寶典 1 預處理指令 define宣告乙個常數,用以表明1年中有多少秒 define second per year 60 60 24 365ul define 語法的基本知識 不能以分號結束 預處理將會計算常數表示式的值,寫出如何計算一年中有多少秒而不是計算出實際的值更有意義 有可能...