Кажется, проблема в том, что Visual Studio расширяет __VA_ARGS__
после , передавая его в последующий макрос, в то время как gcc расширяет его перед передачей.
В вашем случае PP_NARGS(A,V,C,X,Y,Z)
связывает *От 1007 * до __VA_ARGS__
, а затем передает его в целом _xPP_NARGS_IMPL
.
В качестве теста выполните:
#define PP_NARGS(...) \
_xPP_NARGS_IMPL(__VA_ARGS__,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)
#define _xPP_NARGS_IMPL(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,N,...) \
(std::cout << #x1 << std::endl, N)
int main() {
int i = PP_NARGS(A, V, C, X, Y, Z);
std::cout << i;
return 0;
}
Вы увидите A, V, C, X, Y, Z
, напечатанное на экранеи не просто A
, как вы, вероятно, ожидаете.
Возможное решение, как уже предлагалось Ise Wisteria, заключается в форсировании расширения с помощью:
#define EXPAND(x) x
#define PP_NARGS(...) \
EXPAND(_xPP_NARGS_IMPL(__VA_ARGS__,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0))