Vous pouvez laisser l'aide de préprocesseur vous tentez de tricher en utilisant cette stratégie, volée et peaufiné de another answer:
#include <stdio.h>
#include <stdarg.h>
#define PP_NARG(...) \
PP_NARG_(__VA_ARGS__,PP_RSEQ_N())
#define PP_NARG_(...) \
PP_ARG_N(__VA_ARGS__)
#define PP_ARG_N(\
_1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
_11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
_21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
_31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
_41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
_51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
_61,_62,_63,_64,_65,_66,_67,_68,_69,_70, \
_71,_72,_73,_74,_75,_76,_77,_78,_79,_80, \
_81,_82,_83,_84,_85,_86,_87,_88,_89,_90, \
_91,_92,_93,_94,_95,_96,_97,_98,_99,_100, \
_101,_102,_103,_104,_105,_106,_107,_108,_109,_110, \
_111,_112,_113,_114,_115,_116,_117,_118,_119,_120, \
_121,_122,_123,_124,_125,_126,_127,N,...) N
#define PP_RSEQ_N() \
127,126,125,124,123,122,121,120, \
119,118,117,116,115,114,113,112,111,110, \
109,108,107,106,105,104,103,102,101,100, \
99,98,97,96,95,94,93,92,91,90, \
89,88,87,86,85,84,83,82,81,80, \
79,78,77,76,75,74,73,72,71,70, \
69,68,67,66,65,64,63,62,61,60, \
59,58,57,56,55,54,53,52,51,50, \
49,48,47,46,45,44,43,42,41,40, \
39,38,37,36,35,34,33,32,31,30, \
29,28,27,26,25,24,23,22,21,20, \
19,18,17,16,15,14,13,12,11,10, \
9,8,7,6,5,4,3,2,1,0
void _variad(size_t argc, ...);
#define variad(...) _variad(PP_NARG(__VA_ARGS__), __VA_ARGS__)
void _variad(size_t argc, ...) {
va_list ap;
va_start(ap, argc);
for (int i = 0; i < argc; i++) {
printf("%d ", va_arg(ap, int));
}
printf("\n");
va_end(ap);
}
int main(int argc, char* argv[]) {
variad(2, 4, 6, 8, 10);
return 0;
}
Il y a quelques trucs astucieux ici.
1) Au lieu d'appeler directement la fonction variadique, vous appelez une macro qui compte les arguments et transmet le nombre d'arguments comme premier argument de la fonction. Le résultat final du préprocesseur sur la principale ressemble:
_variad(5, 2, 4, 6, 8, 10);
2) PP_NARG
est une macro intelligent pour compter les arguments.
Le cheval de trait ici est PP_ARG_N
. Il retourne son 128ème argument, en ignorant les 127 premiers arguments (nommés arbitrairement _1
_2
_3
etc.), en nommant le 128ème argument N
, et en définissant le résultat de la macro à N
.
PP_NARG
PP_ARG_N
avec __VA_ARGS__
invoque concaténé avec PP_RSEQ_N
, une séquence inversée de numéros à compter de 127 à 0.
Si vous fournissez pas d'arguments, la valeur 128e PP_RSEQ_N
est 0. Si vous passez un argument à PP_NARG
, alors cet argument sera passé à PP_ARG_N
comme _1
; _2
sera 127, et le 128e argument à PP_ARG_N
sera 1. Ainsi, chaque argument dans __VA_ARGS__
bumps PP_RSEQ_N
plus d'un, laissant la bonne réponse dans le 128e emplacement.
(Apparemment 127 arguments is the maximum C allows.)
http://groups.google.com/group/comp.std.c/browse_frm/ thread/77ee8c8f92e4a3fb? pli = 1 – Nyan
votre programme fonctionne bien sur ma machine. Il imprime tous les arguments passés à la fonction – Shweta
question connexe: [Macro pour compter le nombre d'arguments] (http://stackoverflow.com/q/11317474/1336150) –