我写了这两个宏:
// 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)); \
}
Run Code Online (Sandbox Code Playgroud)
// 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)); \
}
Run Code Online (Sandbox Code Playgroud)
第一个宏运行良好(在我尝试过的情况下):
_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 *)
Run Code Online (Sandbox Code Playgroud)
但是第二个宏...在“int”情况下效果不佳(使用 float 和 double yes):
_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)
Run Code Online (Sandbox Code Playgroud)
gcc 显示的错误是:
unitarium4c.c:115: 错误:声明说明符中有两种或多种数据类型 unitarium4c.c:在函数“assert_eq_int_vector_constructor”中: unitarium4c.c:115: 错误: 参数名称省略 unitarium4c.c:115: 错误:'int' 之前的预期表达式 unitarium4c.c:115: 错误:'int' 之前的预期表达式
:pi 不明白为什么会出现这个错误。(如果我复制宏并展开它,它在“int”情况下运行良好)。
提前致谢 :) 。
尝试
// _GENERIC_ASSERT_EQ_VECTOR_CONSTRUCTOR_(int, INT, Int, int) // Here i have an error
_GENERIC_ASSERT_EQ_VECTOR_CONSTRUCTOR_(integer, INT, Int, int)
// _____^^^^^^^_____
Run Code Online (Sandbox Code Playgroud)
原始宏的扩展将创建
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)); \
}
Run Code Online (Sandbox Code Playgroud)
您还可以告诉 gcc 在展开宏后停止“编译”并检查生成的代码。尝试
gcc -E 源代码
| 归档时间: |
|
| 查看次数: |
1457 次 |
| 最近记录: |