C宏:函数工厂,为什么宏只在一种情况下工作?
问题描述:
我写这两个宏:C宏:函数工厂,为什么宏只在一种情况下工作?
// 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)); \
}
第一个宏效果很好(在情况下,我已经试过):
_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 *)
,但第二个宏...没有按在'int'情况下工作得很好(带有浮点数和双精度是):
_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)
gcc向我显示的错误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我不明白为什么会出现这种错误。 (如果我复制宏并扩展它,它在'int'情况下效果很好)。
在此先感谢:)。
答
您在宏体中有一个宏参数n
和一个函数参数int n
,所以这就变成了int int
。
答
尝试
// _GENERIC_ASSERT_EQ_VECTOR_CONSTRUCTOR_(int, INT, Int, int) // Here i have an error
_GENERIC_ASSERT_EQ_VECTOR_CONSTRUCTOR_(integer, INT, Int, int)
// _____^^^^^^^_____
原宏的扩大将创造
assert_data_t *assert_eq_int_vector_constructor \
(int * a, int * b, int int, int passed) { \
/* __________________^^^^^^^__ */
return assert_data_constructor \
(_ASSERT_EQ_INT_VECTOR_, passed, IntVector(a, n), IntVector(b, n)); \
}
你也可以告诉GCC停止“编译”扩大宏后并检查所生成的代码。尝试
gcc -E source
谢谢,这是真的:) – castarco 2010-12-07 23:27:14