C++學習總結(一)


C++學習總結

預處理

首先了解一下什么是預處理,C語言的預處理是為了展開頭文件/宏替換/去掉注釋/條件編譯,其主要包含三個方面的內容: 1.宏定義; 2.文件包含; 3.條件編譯。 預處理命令以符號“#”開頭。

宏定義

不帶參數的宏定義:

宏定義又稱為宏代換、宏替換,簡稱“宏”。它的格式:#define標識符文本。其中的標識符就是所謂的符號常量,也稱為“宏名”。預處理(預編譯)工作也叫做宏展開:將宏名替換為文本(這個文本可以是字符串、可以是代碼等)。掌握"宏"概念的關鍵是“換”。一切以換為前提、做任何事情之前先要換,准確理解之前就要“換”。即在對相關命令或語句的含義和功能作具體分析之前就要換,例:#define PI 3.1415926把程序中全部的標識符PI換成3.1415926
特殊說明:

  • 宏名一般用大寫
  • 使用宏可提高程序的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:數組大小常用宏定義
  • 可以用#undef命令終止宏定義的作用域
  • 宏定義可以嵌套
帶參數的宏:

除了一般的字符串替換,還要做參數代換格式:#define 宏名(參數表) 文本例如:

#define S(a,b)
a*b area=S(3,2);

第一步被換為area=ab; 第二步被換為area=32;類似於函數調用,有一個啞實結合的過程:
(1)實參如果是表達式容易出問題

#define S(r) r*r
area=S(a+b);

第一步換為area=rr;,第二步被換為area=a+ba+b;正確的宏定義是#define S(r) ((r)*(r))

  • 宏名和參數的括號間不能有空格
  • 宏替換只作替換,不做計算,不做表達式求解
  • 函數調用在編譯后程序運行時進行,並且分配內存。宏替換在編譯前進行,不分配內存
  • 宏的啞實結合不存在類型,也沒有類型轉換。
  • 宏展開使源程序變長,函數調用不會
  • 宏展開不占運行時間,只占編譯時間,函數調用占運行時間(分配內存、保留現場、值傳遞、返回值)

常見預處理命令:

其中pragma比較重要,通常使用#pragma(extern "C" )在C++中來告訴編譯器下面是c語言風格。

條件編譯

常見的條件編譯語句:

#if-#else-#endif其調用格式為:
#if 條件表達式
    程序段1
#else
    程序段2
#endif

如下面代碼所示:

#define flag 0
#include<stdio.h>
int main(){
  #if !flag  //條件編譯如果 
   printf("yes");
  #else
   printf("no");
  #endif //標志條件編譯的結束 
}
#ifndef-#define-#endif其調用格式為:
#ifndef 標識符
#define 標識符 替換列表
    //...
#endif

功能為:一般用於檢測程序中是否已經定義了名字為某標識符的宏,如果沒有定義該宏,則定義該宏,並選中從 #define 開始到 #endif 之間的程序段;如果已定義,則不再重復定義該符號,且相應程序段不被選中。如果之前定義過了就使用它,忽略 #define 開始到 #endif 之間再次定義的,之前沒有定義就使用#define 開始到 #endif 之間的。

#if-#elif-#else-#endif其調用格式是:
#if 條件表達式1
    程序段 1
#elif 條件表達式2
    程序段 2
#else
    程序段3
#endif

先判斷條件1的值,如果為真,則程序段 1 被選中編譯;如果為假,而條件表達式 2 的值為真,則程序段 2 被選中編譯;其他情況,程序段 3 被選中編譯。

頭文件包含

一個文件包含另一個文件的內容,格式:

#include "文件名"
或
#include <文件名>

編譯時以包含處理以后的文件為編譯單位,被包含的文件是源文件的一部分。編譯以后只得到一個目標文件.obj被包含的文件又被稱為“標題文件”或“頭部文件”、“頭文件”,並且常用.h作擴展名。修改頭文件后所有包含該文件的文件都要重新編譯頭文件的內容除了函數原型和宏定義外,還可以有結構體定義,全局變量定義:

  • 一個#include命令指定一個頭文件;
  • 文件1包含文件2,文件2用到文件3,則文件3的包含命令#include應放在文件1的頭部第一行;
  • 包含可以嵌套;
  • <文件名>稱為標准方式,系統到頭文件目錄查找文件,"文件名"則先在當前目錄查找,而后到頭文件目錄查找;
  • 被包含文件中的靜態全局變量不用在包含文件中聲明。

C++基礎知識

  • 強制類型轉換的格式:(typeName) value或typeName (value)。第一種來自C語言,第二種格式的C++。
  • const常量被初始化后,其值就固定了,編譯器將不允許在修改該常量的值。相比#define,const更好,首先它能夠明確指定類型,其次可以使用C++的作用域規則將定義限制在特定的函數或者文件中,其中作用域規則描述了名稱在各種模塊中的可知程度。第三,可以將const用於更加復雜的類型,如數組和結構。
  • 數組:只有在定義數組時才能初始化,此后就不能使用了,也不能將一個數組賦給另一個數組。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM