追加の引数なしで呼び出すと が生成され、 1 つまたは複数の引数を指定して呼び出すと が生成さIFARGS(YES, NO, ...)
れるように C マクロを定義するにはどうすればよいでしょうか?IFARGS
NO
IFARGS
YES
GCC を使用した回答がありますが (以下を参照)、可能であれば C99 (またはその不可能性の証明) を使用したいと思います。
追加の引数なしで呼び出すと が生成され、 1 つまたは複数の引数を指定して呼び出すと が生成さIFARGS(YES, NO, ...)
れるように C マクロを定義するにはどうすればよいでしょうか?IFARGS
NO
IFARGS
YES
GCC を使用した回答がありますが (以下を参照)、可能であれば C99 (またはその不可能性の証明) を使用したいと思います。
#define GET(_0, _1) _0 // Return the first of two arguments
#define GET_(_0, _1) _1 // Return the second of two arguments
#define JOIN(_0, _1) _0 ## _1 // Concatenate two arguments
#define EJOIN(_0, _1) JOIN(_0, _1) // Expand macros and concatenate
#define FIRST(_, ...) _ // Truncate everything after first comma
#define EFIRST(_) FIRST(_) // Expand argument and pass to FIRST
#define REST(_0, ...) __VA_ARGS__ // Remove everything before first comma
#define GET_GET(...) \
EJOIN(GET, EFIRST(REST(,,##__VA_ARGS__ _))) // Branch between GET and GET_
#define IFARGS(YES, NO, ...) GET_GET(__VA_ARGS__)(YES, NO)
これが C99 で可能であれば、次##__VA_ARGS__
のようにシミュレートできることに注意してください。
#define PREPEND_COMMA(...) , __VA_ARGS__
#define NO_COMMA()
#define PREPEND_COMMA_IF_NONEMPTY(...) IFARGS(PREPEND_COMMA, NO_COMMA, __VA_ARGS__)(__VA_ARGS__)
次に、 の任意のインスタンスを, ##__VA_ARGS__
に置き換えることができますPREPEND_COMMA_IF_NONEMPTY(__VA_ARGS__)
。