C 語言的 GCC 擴充套件

2021-08-31 23:51:27 字數 1330 閱讀 5760

gnu 編譯器(gcc)提供了很多 c 語言擴充套件,編譯器會使用該資訊生成更高效的機器**。

內聯函式

static inline __attribute__ ((always_inline)) int foo(void)

避免內聯

__attribute__ ((noinline)) int foo(void)

純函式

__attribute__ ((pure)) int foo(int val)
返回值只受函式引數或 nonvolatile 全域性變數影響。

常函式

__attribute__ ((const)) int foo(int val)
常函式是一種嚴格的純函式。常函式不能訪問全域性變數,引數不能是指標型別。因此,常函式的返回值只和值傳遞的引數值有關。

沒有返回值的函式

__attribute__ ((noreturn)) void foo(int val)
分配記憶體的函式

__attribute__ ((malloc)) void *copy()

強制呼叫方檢查返回值

1 #include 2 

3 __attribute__ ((warn_unused_result)) int foo()

4 7

8 int main()

9

把函式標識為「deprecated(已廢棄)」

__attribute__ ((deprecated)) void foo(void)

把函式標識為已使用

static __attribute__ ((used)) void foo(void)

把函式或引數標識為未使用的

int foo(int __attribute__ ((unused)) value)

對結構體進行緊湊儲存(pack)

struct __attribute__ ((packed)) foo ;
packed 屬性告訴編譯器乙個型別或變數應該在記憶體中緊湊儲存,使用盡可能少的空間,可能不依賴對齊需求。如果在結構體(struct)或聯合體(union)上指定該屬性,就需要對所有變數進行緊湊儲存。如果只是對某個變數指定該屬性,就只會緊湊儲存該特定變數。

GCC對C語言的一些擴充套件小結

最近在看一些源 遇到了一些使用 attribute 修飾函式和變數的屬性方面的 不是太了解,很是汗顏,再此做個總結 gcc使用 attribute 關鍵字來描述函式,變數和資料型別的屬性,用於編譯器對源 的優化。描述函式屬性的幾個重要的關鍵字 上面只是對常見的一些屬性操作的解釋,對於其他的用法應當參...

GCC擴充套件特性

遇到了乙個關於零陣列定義的問題,總結如下 零陣列的使用的好處是 它在結構裡不占用空間,但是結構可以通過它訪問結構之外的資料。這也給了它的很大的訪問許可權,因此在通過零陣列訪問之前,一定要檢查訪問範圍的有效性。下面是乙個簡單的例子 include include typedef struct arra...

GCC擴充套件符( , )

先來說說這兩個擴充套件符的各自用處吧 是將巨集字串化 stringification 是將 左右兩邊的標籤組合在一起 token pasting or token concatenation 下面從兩個簡單例子著手 cpp define ssvar x,y const char x y ssvar ...