6
#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); 

誰かがこの行の##が何であるかを理解するのを手伝ってもらえますか?ありがとうございました

4

2 に答える 2

3

可変個引数マクロ(複数の可変引数を持つマクロ)のトークンです。fの後に、への入力として0個以上の引数を許可するgcc固有のディレクティブext4_debug()。つまり、f引数は必須でaあり、存在する場合と存在しない場合があります。

これはprintf(const char *fmt,...)fmtが必須であり、他の引数がオプションであり、に依存している場合と同じですfmt。このドキュメントの最後のステートメントを参照してください:http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

于 2012-11-05T04:36:15.220 に答える
2

0個の引数を渡した場合に可変個引数マクロ(複数の引数を取ることができるマクロ)を機能させるためにあります。

GCCマニュアルのVariadicMacrosセクションから:

次に、##トークンの貼り付け演算子は、コンマと可変引数の間に配置すると特別な意味を持ちます。あなたが書くなら

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

マクロを使用する場合は変数引数をeprintf省略し、##の前のコンマを削除します。これは、空の引数を渡した場合には発生しません。また、##の前のトークンがコンマ以外の場合にも発生しません。

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

これを使用しなかった場合は、に展開されfrpintf(stderr, "success!\n",)ますが、これは構文エラーです。

于 2012-11-05T04:40:06.420 に答える