|
324 | 324 | * pretty trivial: VA_ARGS_NARGS_() returns its 64th argument, and we set up
|
325 | 325 | * the call so that that is the appropriate one of the list of constants.
|
326 | 326 | * This idea is due to Laurent Deniau.
|
| 327 | + * |
| 328 | + * MSVC has an implementation of __VA_ARGS__ that doesn't conform to the |
| 329 | + * standard unless you use the /Zc:preprocessor compiler flag, but that |
| 330 | + * isn't available before Visual Studio 2019. For now, use a different |
| 331 | + * definition that also works on older compilers. |
327 | 332 | */
|
| 333 | +#ifdef _MSC_VER |
| 334 | +#define EXPAND(args) args |
| 335 | +#define VA_ARGS_NARGS(...) \ |
| 336 | + VA_ARGS_NARGS_ EXPAND((__VA_ARGS__, \ |
| 337 | + 63,62,61,60, \ |
| 338 | + 59,58,57,56,55,54,53,52,51,50, \ |
| 339 | + 49,48,47,46,45,44,43,42,41,40, \ |
| 340 | + 39,38,37,36,35,34,33,32,31,30, \ |
| 341 | + 29,28,27,26,25,24,23,22,21,20, \ |
| 342 | + 19,18,17,16,15,14,13,12,11,10, \ |
| 343 | + 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)) |
| 344 | +#else |
| 345 | + |
328 | 346 | #define VA_ARGS_NARGS(...) \
|
329 | 347 | VA_ARGS_NARGS_(__VA_ARGS__, \
|
330 | 348 | 63,62,61,60, \
|
|
334 | 352 | 29,28,27,26,25,24,23,22,21,20, \
|
335 | 353 | 19,18,17,16,15,14,13,12,11,10, \
|
336 | 354 | 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
|
| 355 | +#endif |
| 356 | + |
337 | 357 | #define VA_ARGS_NARGS_( \
|
338 | 358 | _01,_02,_03,_04,_05,_06,_07,_08,_09,_10, \
|
339 | 359 | _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
|
|
0 commit comments