c 關鍵字盲點解析

2022-09-11 04:30:08 字數 2338 閱讀 9178

volatile:指出變數易變,這裡的易變是指不為編譯器知道的變化,通常來自作業系統,硬體或其他執行緒。該引數不與const衝突,const只是在編譯層面上保證變數的常量性,即不可賦值性,是一種在編譯時期的保證。

故,const 和volatile可共同修飾某一變數,volatile也可修飾指標,volatile int a; int b=a;int c=a;b和c的值可能不一樣。使用場景:對並行場景的狀態暫存器的訪問。

mutable用來突破const的限制,用來修飾類的非靜態成員變數,在類的靜態函式中,這些被mutable修飾的變數可以賦值。

const 修飾 普通變數 常量性

const 修飾成員變數 常量性

const 修飾成員函式 this指標的內容不可改變,但可以用mutable來突破限制

const修飾形參 通常可以相容非const變數的實參傳入

const 修飾函式返回值,通常用與操作符過載,避免出現a+b=c或(a=b)=c的句子。

alignas (x)  對齊聲明 ,x只能是2的次方。

struct  alignas(2)a

sizeof(a)=8, 因為 int c 表明至少是4b對齊的,a的大小因該為4的倍數

alignof (x)   查明x的對齊方式

asm 用於內嵌彙編語句 

explicit 遮蔽隱式轉換

export 通常模板函式的宣告和定義在乙個標頭檔案中,原因是模板的定義是生成模板例項的乙個規則(生成 實現函式** 的規則),並不是像普通函式一樣的定義(實現函式的**),要到呼叫或顯示具體化時才會生成模板函式的實現**

具體化:為特定型別規定乙個生產模板函式實現的規則:

tameplate<> void swap(job&j1,job&j2)

或tameplate<> void swap(job&j1,job&j2){

例項化:根據某個函式模板例項出乙份實現**

顯示地:

swap(j1,j2);

或tameplate void swap(job &,job &);

隱式地:直接呼叫 swap(),形參為兩個job&

constexpr 修飾常量表示式,即在編譯期能夠求到值的變數,在編譯後該變數直接用具體的常量值代替,編譯器能對器進行很大的優化,是一種很強的約束,比巨集更安全

constexpr值可用於enum、switch、陣列長度等場合。變數不能宣告陣列的原因是,陣列的大小需要在編譯器確定。

constexpr所修飾的變數一定是編譯期可求值的,所修飾的函式在其所有引數都是constexpr時,一定會返回constexpr。

constexpr 能夠修飾類建構函式,保證如果給類建構函式的傳參都是 constexpr的,那麼其所有的類成員都是constexpr,建構函式體應該為空,所有成員在初始化列表中初始化。

decltype :

分析變數型別與auto不同。

noexcept:該關鍵字告訴編譯器,函式中不會發生異常,這有利於編譯器對程式做更多的優化,如果在執行時,noexecpt函式向外丟擲了異常(如果函式內部捕捉了異常並完成處理,這種情況不算丟擲異常),程式會直接終止,呼叫std::terminate()函式,該函式內部會呼叫std::abort()終止程式。

關於null巨集:

c中,null實際上是乙個void *的指標,然後吧void *指標賦值給int *和foo_t *的指標的時候,隱式轉換成相應的型別。而如果換做乙個c++編譯器來編譯的話是要出錯的,因為c++是強型別的,void *是不能隱式轉換成其他指標型別的,所以通常情況下,編譯器提供的標頭檔案會這樣定義null:

#ifndef null

#ifdef __cplusplus

#define null 0

#else

#define null ((void *)0)

#endif

#endif

也就是說c++中 null 就是0,這在過載函式時比如 fun(int) 和fun(int*)時,呼叫fun(null) 或呼叫第乙個函式。

nullptr 解決了上訴的二義性

thread_local變數是c++ 11新引入的一種儲存型別。它會影響變數的儲存週期(storage duration),c++中有4種儲存週期:

automatic(棧)

static(全域性變數區)

dynamic(堆)

thread

那麼,哪些變數可以被宣告為thread_local?以下3類都是ok的

命名空間下的全域性變數

類的static成員變數

本地變數

typeid是c++的關鍵字之一,等同於sizeof這類的操作符。typeid操作符的返回結果是名為type_info的標準庫型別的物件的引用。

C關鍵字的解析

以下對一些c關鍵字的特別用法進行剖析 關鍵字修飾的是最近的變數即就近原則 extern和volatile extern和volatile各自單一的用法就不多說了。當兩個在一起使用時表示 介面 extern修飾 易變 volatile修飾 變數 用法 main.c檔案中 volatile uint8 ...

C語言關鍵字解析

c語言關鍵字解析 c語言關鍵字有32個,如表1所示。雖然簡單,但還是讓一些初學者犯錯,譬如sizeof,好多初學者都認為是函式,其中包括我的一些同學,他們學過有好多年了,如此看來,有時我們追求高深的內容,往往會忽略基礎的簡單的內容!表1 c語言標準定義的 32個關鍵字 關鍵字 意義 auto 宣告自...

C語言深入解析 關鍵字

此文僅參考陳正衝老師所寫 c 語言標準定義的 32 個關鍵字 關鍵字 意 義 auto 宣告自動變數,預設時編譯器一般預設為 auto int 宣告整型變數 double 宣告雙精度變數 long 宣告長整型變數 char 宣告字元型變數 float 宣告浮點型變數 short 宣告短整型變數 si...