簡體   English   中英

以下C宏有什么作用?

[英]What does the following C macro do?

#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif

##在C中意味着什么? 這是占位符還是功能?

它被稱為令牌粘貼操作符 ,它連接令牌,以便在預處理期間123313 ## LL變為123313LL

還有一個字符串化運算符 # ,它將#name轉換為"name"

不, ##不是函數的占位符,它是一個令牌粘貼操作符。 它僅在預處理器宏內(有或沒有參數)有效。 它產生左右兩側的串聯。

例如,如果傳遞INT64_C值為123

INT64_C(123)

預處理器產生的結果等同於寫入

123LL

這些宏背后的想法是使代碼中的有符號和無符號常量更加突出:看起來像INT64_C(123)可能比等效的123LL更具可讀性。 對於其他等效的123ll ,它肯定是一個很大的改進,看起來像一個完全不同的數字。

##表示連接兩個標記。

因此(c ## LL)將被預處理為cLL

但要注意,它是在預處理階段完成的,所以它不像strcat

int i = 3;
INT64_C(i);

將生成iLL而不是3LL

正如其他人提到的, ##兩個令牌粘貼在一起。

#define INT64_C(c) (c ## LL)

因此, INT64_C(123) (123LL)在宏擴展后變為(123LL)

這些宏存在,因此您可以移植使用int64_t常量。 在大多數64位系統上,宏將被定義為:

#define INT64_C(c) (c ## L)

這是因為在大多數64位系統上, int64_tlong所以常量應該是123L 在大多數32位系統和Windows上, int64_t long long因此常量應為123LL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM