欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言中類型捕獲(typeof)的使用

 更新時(shí)間:2025年09月17日 09:36:45   作者:Lumiron  
C語(yǔ)言中typeof是一個(gè)編譯器擴(kuò)展,支持泛型宏開(kāi)發(fā),可避免表達(dá)式重復(fù)求值,提升代碼可讀性,本文就來(lái)詳細(xì)的介紹一下C語(yǔ)言中類型捕獲(typeof)的使用,感興趣的可以來(lái)了解一下

它的作用是在編譯時(shí)獲取變量或表達(dá)式的類型。它非常強(qiáng)大,常用于編寫類型通用的代碼或簡(jiǎn)化復(fù)雜類型的聲明,是 C 語(yǔ)言中一種“泛型編程”的實(shí)用技巧。

基本用法

typeof 的基本語(yǔ)法是 typeof(expression) 或 typeof(type)。

a) 獲取變量類型

用于聲明一個(gè)與另一個(gè)變量相同類型的新變量。

int a = 10;
// 聲明一個(gè)與變量a類型相同(即int)的變量b
typeof(a) b = 20;

double foo;
// 聲明一個(gè)與foo類型相同(即double)的數(shù)組
typeof(foo) array[10];

b) 獲取表達(dá)式類型

你可以獲取一個(gè)表達(dá)式的類型,即使這個(gè)表達(dá)式還沒(méi)有被求值。

// 聲明一個(gè)變量c,其類型是表達(dá)式 (a + b) 的結(jié)果類型
typeof(a + b) c;

// 一個(gè)更復(fù)雜的例子:聲明一個(gè)指針,指向一個(gè)返回int、接受double參數(shù)的函數(shù)
int some_func(double d);
typeof(some_func) *func_ptr; // func_ptr 的類型是 int (*)(double)

c) 簡(jiǎn)化復(fù)雜聲明

C 語(yǔ)言中復(fù)雜的指針和數(shù)組聲明可能很難讀懂,typeof 可以極大地提高代碼的可讀性。
沒(méi)有 typeof 的復(fù)雜代碼:

// 一個(gè)指向長(zhǎng)度為5的int數(shù)組的指針
int (*array_ptr)[5];

// 一個(gè)函數(shù)指針,該函數(shù)接受一個(gè)int參數(shù)并返回一個(gè)指向char的指針
char *(*func_ptr)(int);

使用 typeof 簡(jiǎn)化:

// 先定義一個(gè)簡(jiǎn)單的數(shù)組類型
int array[5];
// 然后用typeof獲取“指向這個(gè)數(shù)組類型的指針”
typeof(array) *array_ptr; // 等價(jià)于 int (*array_ptr)[5];

// 先定義一個(gè)函數(shù)(或使用已有的)
char *some_func(int);
// 然后用typeof獲取“指向這個(gè)函數(shù)類型的指針”
typeof(some_func) *func_ptr; // 等價(jià)于 char *(*func_ptr)(int);

經(jīng)典應(yīng)用:編寫“泛型”宏

typeof 最常見(jiàn)的用途是編寫可以處理多種類型的宏,從而實(shí)現(xiàn)類似 C++ 模板的功能。Linux 內(nèi)核源碼中大量使用了這種技術(shù)。

示例1:一個(gè)簡(jiǎn)單的 Max 宏

一個(gè)簡(jiǎn)單的 MAX 宏如果只用 (a > b) ? a : b 實(shí)現(xiàn),如果參數(shù)是有副作用的表達(dá)式(如 a++),可能會(huì)被求值兩次,導(dǎo)致錯(cuò)誤。
使用 typeof 可以創(chuàng)建一個(gè)安全版本的 MAX 宏:

#define MAX(a, b) ({      \
    typeof(a) _a = (a);   \
    typeof(b) _b = (b);   \
    _a > _b ? _a : _b;    \
})

int main() {
    int x = 5, y = 10;
    int result = MAX(x++, y++); // 安全,x++和y++只執(zhí)行一次

    printf("result = %d, x = %d, y = %d\n", result, x, y);
    // 輸出:result = 10, x = 6, y = 11
    return 0;
}

解釋:({ … }) 是 GCC 的語(yǔ)句表達(dá)式擴(kuò)展,它允許一個(gè)代碼塊產(chǎn)生一個(gè)值。宏內(nèi)部創(chuàng)建了局部變量 _a 和 _b 來(lái)存儲(chǔ)參數(shù)的值,避免了多次求值。

示例2:交換兩個(gè)變量的值

一個(gè)通用的 SWAP 宏:

#define SWAP(a, b) do { \
    typeof(a) _temp = a; \
    a = b;              \
    b = _temp;          \
} while (0)

int main() {
    int i = 1, j = 2;
    SWAP(i, j);

    double x = 3.14, y = 2.71;
    SWAP(x, y);

    return 0;
}

這個(gè)宏可以交換任何相同類型的變量(int, double, struct 等)。

注意事項(xiàng)和限制

1、非標(biāo)準(zhǔn):最重要的一點(diǎn),typeof 不是標(biāo)準(zhǔn) C。如果你寫的代碼需要極高的可移植性,并且必須能用 MSVC 等不支持此擴(kuò)展的編譯器編譯,就應(yīng)該避免使用它。
2、編譯器支持:主要被 GCC 和 Clang 支持。
3、typeof 關(guān)鍵字:在頭文件中,為了避免與用戶定義的標(biāo)識(shí)符沖突,GCC 建議使用 typeof,它與 typeof 的含義完全相同,但更“安全”。
4、C11 中的 _Generic:C11 標(biāo)準(zhǔn)引入了一個(gè)真正的泛型選擇機(jī)制 _Generic,它可以在編譯時(shí)根據(jù)表達(dá)式的類型選擇不同的代碼分支。雖然它的用法與 typeof 不同,但它是標(biāo)準(zhǔn)委員會(huì)提供的解決類似“泛型”需求的方案。
_Generic 示例:

#define get_type_name(x) _Generic((x), \
    int: "int",                       \
    double: "double",                 \
    default: "unknown type"           \
)

int main() {
    int i;
    printf("%s\n", get_type_name(i)); // 輸出 "int"
}

到此這篇關(guān)于C語(yǔ)言中類型捕獲(typeof)的使用的文章就介紹到這了,更多相關(guān)C語(yǔ)言 類型捕獲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Opencv實(shí)現(xiàn)視頻播放與進(jìn)度控制

    Opencv實(shí)現(xiàn)視頻播放與進(jìn)度控制

    這篇文章主要為大家詳細(xì)介紹了Opencv實(shí)現(xiàn)視頻播放與進(jìn)度控制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語(yǔ)言菜鳥(niǎo)基礎(chǔ)教程之自定義函數(shù)

    C語(yǔ)言菜鳥(niǎo)基礎(chǔ)教程之自定義函數(shù)

    自定義函數(shù): 必須直接或間接在main中調(diào)用,否則該自定義函數(shù)不會(huì)被執(zhí)行。 返回值類型 函數(shù)名(參數(shù)類型 參數(shù)名,參數(shù)類型 參數(shù)名...)
    2017-10-10
  • 最新評(píng)論