C 學習細節

2021-09-24 04:14:27 字數 3009 閱讀 9372

#ifndef #define #endif的使用:防止該標頭檔案被重複引用

其實「被重複引用」是指乙個標頭檔案在同乙個cpp檔案中被include了多次,這種錯誤常常是由於include巢狀造成的。比如:存在a.**件#include "c.h"而此時b.cpp檔案匯入了#include 「a.h」 和#include "c.h"此時就會造成c.h重複引用。

標頭檔案被重複引用引起的後果:

有些標頭檔案重複引用只是增加了編譯工作的工作量,不會引起太大的問題,僅僅是編譯效率低一些,但是對於大工程而言編譯效率低下那將是一件多麼痛苦的事情。

有些標頭檔案重複包含,會引起錯誤,比如在標頭檔案中定義了全域性變數(雖然這種方式不被推薦,但確實是c規範允許的)這種會引起重複定義。

是不是所有的標頭檔案中都要加入#ifndef/#define/#endif 這些**?

答案:不是一定要加,但是不管怎樣,用#ifnde *** #define *** #endif或者其他方式避免標頭檔案重複包含,只有好處沒有壞處。個人覺得培養乙個好的程式設計習慣是學習程式設計的乙個重要分支。

下面給乙個#ifndef/#define/#endif的格式:

#ifndef a_h意思是"if

not define a.h" 如果不存在a.h

接著的語句應該#define a_h 就引入a.h

最後一句應該寫#endif 否則不需要引入

#ifndef graphics_h // 防止graphics.h被重複引用 

#define graphics_h

#include // 引用標準庫的標頭檔案

… #include 「header.h」 // 引用非標準庫的標頭檔案

…void function1(…); // 全域性函式宣告

… class box // 類結構宣告

; #endif

1.2防止檔案被多次引用。一般形式為:

#ifndef _***_h_

#define _***_h_

...#endif

_***_h_是任意的,上述**可以解釋為:如果沒有定義***那麼就定義***然後執行裡面的內容,如果下次還走到這個檔案,進行#ifndef判斷,下面的內容就不會執行

2. enum class,enum struct組合的使用

2.1. 傳說中的enum關鍵字

不管是c語言,還是c++語言, 其中都有enum關鍵字。這是這兩種語言的基礎知識中都會涉及到的點。

其具體定義方法如下:

enum my_enum

;

當然也可以省略 enum的名字,使用匿名的方式定義列舉,如下所示:

enum

;

或者與 『typedef』 關鍵字聯合使用,如:

typedef enum 

my_enum;

2.2 傳統enum關鍵字存在的問題

全域性作用域

傳統的enum關鍵字的作用域是全域性的,也就是說,如果在enum a中宣告的乙個列舉型別my_enum3,無法在enum b中宣告同樣的列舉型別,具體的就是,如下的寫法是錯誤的,會出現編譯錯誤(會報 重定義錯誤)

enum a

;enum b

;

能隱式轉換為其他型別(如整型)

具體如下面的**所示:

enum my_enum

;int my_int = my_enum1;

無法指定底層使用的資料型別

也就是說,無法明確的知道,乙個列舉型別,占用記憶體的位元組數,這樣在結構體中使用enum的時候就可能遇到麻煩, 特別是結構體需要記憶體對齊或者填充處理的時候問題就尤為突出了。

2.3 奇妙的enum class,enum struct組合

在c++11標準中,除了傳統的enum關鍵字之外, 還新增了乙個概念: enum class, enum struct組合的形式(兩者是等價的),當然單純的enum關鍵字和enum class組合並不衝突,都能使用。 這一組合的出現就是為了解決傳統enum關鍵字面臨的問題。

enum class組合具有class封裝性的特性,作用域是確定的

enum class a

;enum class b

;enum c

;

如上面這樣宣告和定義列舉就是正確的,要訪問a和b中的列舉是需要加上作用域的,形如:

a a = a::my_enum3;

b b = b::my_enum3;

可以指定底層資料型別

enum class a: int /** 每個列舉都是int型別的 */

;enum class b: unsigned char /** 每個列舉都是unsigned char型別的 */

;

不能隱式轉換

int my_int = a::my_enum3; /** 錯誤,無法通過編譯 */

int my_int = static_cast(a::my_enum3); /** 正確, 可以通過編譯

3.c++提供了關鍵字explicit,可以阻止不應該允許的經過轉換建構函式進行的隱式轉換的發生。宣告為explicit的建構函式不能在隱式轉換中使用。

class test1

//普通建構函式

private:

int num;

};class test2

//explicit(顯式)建構函式

private:

int num;

};int main()

0u 表示 無符號整型 0

1u 表示 無符號整型 1

c 學習筆記 細節關鍵點

本文記錄那些該知道卻不甚清楚的東西,基於書本和自己的理解。1.c 定義class,public內放的東西是給外人看的,class開放給外人的介面 private中放的成員是自己用的,外人不必知道,除了我的朋友 friend 2.member funtion必須在class主體內宣告,是否在主體內定義...

C 學習 住著魔鬼的細節

13周的c 課程轉眼就學完了5周,c 的標準基本上已經覆蓋到了。再加上coding了上百行,總算是對c 有了乙個基本的了解。接下來的學習會是關於stl的,所以在此對目前所學做乙個小的總結。thedevilis in the detail,這是我最大最大的體會。由其是對於這種稱之為標準的內容而言。更是...

c 多型細節

c 程式語言是一款應用廣泛,支援多種程式設計的計算機程式語言。我們今天就會為大家詳細介紹其中c 多型性的一些基本知識,以方便大家在學習過程中對此能夠有乙個充分的掌握。多型性可以簡單地概括為 乙個介面,多種方法 程式在執行時才決定呼叫的函式,它是物件導向程式設計領域的核心概念。多型 polymorph...