j'ai écrit ces deux macros:C Macros: Usines de fonction, pourquoi la macro ne fonctionne pas seulement dans un cas?
// Magic Assert Equal Atomic constructor generator
#define _GENERIC_ASSERT_EQ_ATOMIC_CONSTRUCTOR_(n, N, W, tt) \
assert_data_t *assert_eq_##n##_constructor (tt a, tt b, int passed) { \
return assert_data_constructor (_ASSERT_EQ_##N##_, passed, W(a), W(b)); \
}
// Magic Assert Equal Vector constructor generator
#define _GENERIC_ASSERT_EQ_VECTOR_CONSTRUCTOR_(n, N, W, tt) \
assert_data_t *assert_eq_##n##_vector_constructor \
(tt * a, tt * b, int n, int passed) { \
return assert_data_constructor \
(_ASSERT_EQ_##N##_VECTOR_, passed, W##Vector(a, n), W##Vector(b, n)); \
}
la première macro fonctionne bien (dans les cas j'ai essayé):
_GENERIC_ASSERT_EQ_ATOMIC_CONSTRUCTOR_(int, INT, Int, int)
_GENERIC_ASSERT_EQ_ATOMIC_CONSTRUCTOR_(flt, FLT, Flt, float)
_GENERIC_ASSERT_EQ_ATOMIC_CONSTRUCTOR_(dbl, DBL, Dbl, double)
_GENERIC_ASSERT_EQ_ATOMIC_CONSTRUCTOR_(complex_flt, COMPLEX_FLT, ComplexFlt, complex float)
_GENERIC_ASSERT_EQ_ATOMIC_CONSTRUCTOR_(complex_dbl, COMPLEX_DBL, ComplexDbl, complex double)
_GENERIC_ASSERT_EQ_ATOMIC_CONSTRUCTOR_(str, STR, Str, char *)
mais la deuxième macro ... doesn « t fonctionnent bien dans le 'cas int' (avec flotteur et double oui):
_GENERIC_ASSERT_EQ_VECTOR_CONSTRUCTOR_(int, INT, Int, int) // Here i have an error
_GENERIC_ASSERT_EQ_VECTOR_CONSTRUCTOR_(flt, FLT, Flt, float)
_GENERIC_ASSERT_EQ_VECTOR_CONSTRUCTOR_(dbl, DBL, Dbl, double)
l'erreur que gcc me montre i s:
unitarium4c.c:115: error: two or more data types in declaration specifiers unitarium4c.c: In function ‘assert_eq_int_vector_constructor’: unitarium4c.c:115: error: parameter name omitted unitarium4c.c:115: error: expected expression before ‘int’ unitarium4c.c:115: error: expected expression before ‘int’
: p je ne comprends pas pourquoi cette erreur apparaît. (Si je copie la macro et l'agrandit, cela fonctionne bien dans le cas de 'int').
Merci d'avance :).
Merci, c'est vrai :) – castarco