[英]What does the following C macro do?
#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif
##在C中意味着什么? 這是占位符還是功能?
不, ##
不是函數的占位符,它是一個令牌粘貼操作符。 它僅在預處理器宏內(有或沒有參數)有效。 它產生左右兩側的串聯。
例如,如果傳遞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_t
很long
所以常量應該是123L
。 在大多數32位系統和Windows上, int64_t
long long
因此常量應為123LL
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.