android 源碼閱讀的C++語法準(zhǔn)備5 命名空間 預(yù)處理器 異常處理

命名空間

用以區(qū)分不同庫中相同名稱的函數(shù)、類、變量等。本質(zhì)上,命名空間就是定義了一個(gè)范圍,使用了命名空間即定義了上下文。

//定義命名空間
namespace namespace_name {
   // 代碼聲明
}

//使用命名空間,注意和類進(jìn)行區(qū)別啊 
name::code;  // code 可以是變量或函數(shù)

eg:
// 調(diào)用第一個(gè)命名空間中的函數(shù)
first_space::func(); 
// 調(diào)用第二個(gè)命名空間中的函數(shù)
second_space::func();

:: 叫作用域區(qū)分符,指明一個(gè)函數(shù)屬于哪個(gè)類或一個(gè)數(shù)據(jù)屬于哪個(gè)類。

  1. 可以用在類聲明其中的函數(shù)、變量等double Box::getVolume(void){ *** }
  2. 可以用來引用類的靜態(tài)成員和方法
  3. 可以用來引用命名空間中的函數(shù)、類、變量等,嵌套的命名空間

using 指令

可以使用 using namespace 指令,這樣在使用命名空間時(shí)就可以不用在前面加上命名空間的名稱。這個(gè)指令會(huì)告訴編譯器,后續(xù)的代碼將使用指定的命名空間中的名稱。

#include <iostream>
//使用std命名空間
using namespace std;
//using 指令也可以用來指定命名空間中的特定項(xiàng)目,相當(dāng)于java的靜態(tài)導(dǎo)入
using std::cout;
 
// 第一個(gè)命名空間
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
}
// 第二個(gè)命名空間
namespace second_space{
   void func(){
      cout << "Inside second_space" << endl;
   }
}

using namespace first_space;
int main ()
{
   // 調(diào)用第一個(gè)命名空間中的函數(shù)
   func();
   return 0;
}

不連續(xù)的命名空間

命名空間可以定義在幾個(gè)不同的部分中,一個(gè)命名空間的各個(gè)組成部分可以分散在多個(gè)文件中。

如果定義的時(shí)候,發(fā)生了命名空間的嵌套,可以使用如下的形式引用其他命名空間

using namespace first_space::second_space;

C++ 預(yù)處理器

預(yù)處理器是一些指令,它指示編譯器在實(shí)際編譯之前所需完成的預(yù)處理。

所有的預(yù)處理器指令都是以井號(hào)(#)開頭,只有空格字符可以出現(xiàn)在預(yù)處理指令之前。預(yù)處理指令不是 C++ 語句,不會(huì)以分號(hào)(;)結(jié)尾。

常用的預(yù)處理指令

指令 中文 解釋 一般形式 示例
#define 宏定義 創(chuàng)建符號(hào)常量,該符號(hào)常量通常稱為宏,即定義宏常量 #define macro-name replacement-text #define PI 3.14159
參數(shù)宏 定義帶參數(shù)的宏,類比inline #define macro-name(paras list) condition-return #define MIN(a,b) (a<b ? a : b)
#ifdef #endif 條件編譯 有選擇地對部分程序源代碼進(jìn)行編譯 #ifdef #endif \n #ifndef #endif #ifdef NULL #define NULL 0 #endif

宏常量

#define DEBUG
#define PI 3.14159
#define MIN(a,b) (a<b ? a : b)
 
int main ()
{
   int i, j;
   i = 100;
   j = 30;
   cout <<"較小的值為:" << MIN(i, j) << endl;
   //如果在指令 #ifdef DEBUG 之前已經(jīng)定義了符號(hào)常量 DEBUG,則會(huì)編譯 cerr 語句
   #ifdef DEBUG
   cerr <<"Variable x = " << x << endl;
   #endif
   
   //可以用來注釋代碼
   #if 0
    /* 這是注釋部分 */
   //不進(jìn)行編譯的代碼
   #endif
   return 0;
}

C++ 中的預(yù)定義宏

C++ 提供了下表所示的一些預(yù)定義宏:

描述
__LINE__ 這會(huì)在程序編譯時(shí)包含當(dāng)前行號(hào)。
__FILE__ 這會(huì)在程序編譯時(shí)包含當(dāng)前文件名。
__DATE__ 這會(huì)包含一個(gè)形式為 month/day/year 的字符串,它表示把源文件轉(zhuǎn)換為目標(biāo)代碼的日期。
__TIME__ 這會(huì)包含一個(gè)形式為 hour:minute:second 的字符串,它表示程序被編譯的時(shí)間。
int main ()
{
    cout << "Value of __LINE__ : " << __LINE__ << endl;
    cout << "Value of __FILE__ : " << __FILE__ << endl;
    cout << "Value of __DATE__ : " << __DATE__ << endl;
    cout << "Value of __TIME__ : " << __TIME__ << endl;
 
    return 0;
}

輸出

Value of __LINE__ : 21
Value of __FILE__ : /home/rentianxin/AndroidStudioProjects/RichyDemo/unix/cppdemo/main.cpp
Value of __DATE__ : Mar 23 2019
Value of __TIME__ : 17:02:13

__attribute__ 屬性

GNU C的特色,__attribute__機(jī)制。函數(shù)屬性(Function Attribute),可以幫助開發(fā)者把一些特性添加到函數(shù)聲明中,從而使編譯器在錯(cuò)誤檢查方面的功能更強(qiáng)大。也可以用來提高應(yīng)用程序的兼容性。

attribute機(jī)制也很容易同非GNU應(yīng)用程序做到兼容。

__attribute__可以設(shè)置函數(shù)屬性(Function Attribute)、變量屬性(Variable Attribute)和類型屬性(Type Attribute)。

__attribute__書寫,以前的寫法是 雙-單-雙 線,例如 __attribute_pure__,現(xiàn)在的使用()

__attribute__語法格式為:_attribute_(xxx)

其位置約束為:放于聲明的尾部“;”之前。

#define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A)))

ref:__attribute__ 總結(jié)

# 和 ## 運(yùn)算符--了解就行

# 和 ## 預(yù)處理運(yùn)算符在 C++ 和 ANSI/ISO C 中都是可用的。

# 運(yùn)算符會(huì)把 replacement-text 令牌轉(zhuǎn)換為用引號(hào)引起來的字符串。

## 運(yùn)算符用于連接兩個(gè)令牌。

異常處理

try、catch、throw

#include <iostream>
using namespace std;
 
double division(int a, int b)
{
   if( b == 0 )
   {
      throw "Division by zero condition!";
   }
   return (a/b);
}
 
int main ()
{
   int x = 50;
   int y = 0;
   double z = 0;
 
   try {
     z = division(x, y);
     cout << z << endl;
   }catch (const char* msg) {
     cerr << msg << endl;
   }
 
   return 0;
}

C++ 標(biāo)準(zhǔn)的異常

異常 描述
std::exception 該異常是所有標(biāo)準(zhǔn) C++ 異常的父類。
std::bad_alloc 該異常可以通過 new 拋出。
std::bad_cast 該異??梢酝ㄟ^ dynamic_cast 拋出。
std::bad_exception 這在處理 C++ 程序中無法預(yù)期的異常時(shí)非常有用。
std::bad_typeid 該異??梢酝ㄟ^ typeid 拋出。
std::logic_error 理論上可以通過讀取代碼來檢測到的異常。
std::domain_error 當(dāng)使用了一個(gè)無效的數(shù)學(xué)域時(shí),會(huì)拋出該異常。
std::invalid_argument 當(dāng)使用了無效的參數(shù)時(shí),會(huì)拋出該異常。
std::length_error 當(dāng)創(chuàng)建了太長的 std::string 時(shí),會(huì)拋出該異常。
std::out_of_range 該異常可以通過方法拋出,例如 std::vector 和 std::bitset<>::operator。
std::runtime_error 理論上不可以通過讀取代碼來檢測到的異常。
std::overflow_error 當(dāng)發(fā)生數(shù)學(xué)上溢時(shí),會(huì)拋出該異常。
std::range_error 當(dāng)嘗試存儲(chǔ)超出范圍的值時(shí),會(huì)拋出該異常。
std::underflow_error 當(dāng)發(fā)生數(shù)學(xué)下溢時(shí),會(huì)拋出該異常。

也可以通過繼承和重載 exception 類來定義新的異常。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、 為什么需要命名空間(問題提出) 命名空間是ANSIC++引入的可以由用戶命名的作用域,用來處理程序中 常見的...
    IvanRunning閱讀 2,429評(píng)論 0 2
  • 重新系統(tǒng)學(xué)習(xí)下C++;但是還是少了好多知識(shí)點(diǎn);socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme閱讀 20,419評(píng)論 0 50
  • 本教程旨在提取最精煉、實(shí)用的C++知識(shí)點(diǎn),供讀者快速學(xué)習(xí)及本人查閱復(fù)習(xí)所用,后期會(huì)持續(xù)更新。 基本語法 C++ 語...
    丁俊杰_閱讀 6,156評(píng)論 0 9
  • 譯:君子致力于根本,確立了根本,“道”也就自然產(chǎn)生。
    白藥寶寶888777閱讀 498評(píng)論 0 0
  • 樽中月影,或許那才是我的故鄉(xiāng) 常得你一生癡癡地仰望? 而無論出門向東哭,向西哭 故鄉(xiāng)是否早已淪落 愈來愈近的歸程 ...
    達(dá)魯花赤閱讀 166評(píng)論 0 0

友情鏈接更多精彩內(nèi)容