...
аргументы макроса вставляются в тела макроса с помощью __VA_ARGS__
.Проблема в том, как сделать так, чтобы он был пустым.Если оно пустое, вы, как правило, захотите запятую до того, как оно будет стерто, и вы можете использовать расширение GNU ##__VA_ARGS__
для достижения этого.
#define FOO(AA,BB,...) AA->BB(AA,##__VA_ARGS__) /*GNU extension*/
FOO(mystruct,funcname) //warning with -pedantic
FOO(mystruct,funcname,123)
Приведенное выше, однако, вызовет предупреждения, если скомпилировано с -pedantic
.Если вы хотите, чтобы ваш макрос использовался без предупреждений на -pedantic
, вы могли бы достичь этого, поменяв местами первые два аргумента в определении макроса.
#define FIRST(...) FIRST_(__VA_ARGS__,)
#define FIRST_(X,...) X
#define BAR_(CallExpr,...) CallExpr(__VA_ARGS__)
#define BAR(BB,/*AA,*/...) BAR_(FIRST(__VA_ARGS__)->BB,__VA_ARGS__)
BAR(funcname,mystruct) //no warning
BAR(funcname,mystruct,123)