簡體   English   中英

在printk中“##”,##是什么意思

[英]“##” in printk, what does ## mean

#define ext4_debug(f, a...)                     \
    do {                                \
        printk(KERN_DEBUG "EXT4-fs DEBUG (%s, %d): %s:",    \
            __FILE__, __LINE__, __func__);          \
        printk(KERN_DEBUG f, ## a);             \
    } while (0)

我不明白的是這個

printk(KERN_DEBUG f, ## a); 

有人能幫我理解這行中的##是什么? 謝謝

它是可變參數宏的標記(具有多個可變參數的宏)。 它的gcc特定指令允許在ext4_debug() f之后輸入0或更多參數作為輸入。 這意味着, f參數是強制性的, a可能存在也可能不存在。

這與printf(const char *fmt,...) ,其中, fmt是必需的,其他參數是可選的並且取決於fmt 請參閱此文檔中的最后一條聲明: http//gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

如果你傳入0個參數,那就是使可變參數宏(可以帶多個參數的宏)起作用。

從GCC手冊中的Variadic宏部分

其次,## token paste運算符在逗號和變量參數之間具有特殊含義。 如果你寫

 #define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__) 

當使用eprintf宏時, eprintf變量參數,然后刪除##之前的逗號。 如果傳遞一個空參數,則不會發生這種情況,如果##之前的標記不是逗號,也不會發生這種情況。

 eprintf ("success!\\n") ==> fprintf(stderr, "success!\\n"); 

如果你沒有使用它,那么它將擴展為frpintf(stderr, "success!\\n",) ,這是一個語法錯誤。

暫無
暫無

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

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