我写了两个宏:


// 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 *)

但是第二个宏在“in t”情况下工作不好(使用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)

gcc显示的错误是:
unitarium4c.c:115:错误:声明说明符中有两个或多个数据类型
unitarium4c.c:在函数“assert_eq_int_vector_constructor”中:
unitarium4c.c:115:错误:忽略参数名
unitarium4c.c:115:错误:“int”前应为表达式
unitarium4c.c:115:错误:“int”前应为表达式
:p我不明白为什么会出现这个错误(如果我复制宏并将其展开,它在“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源

关于c - C宏:函数工厂,为什么宏仅在一种情况下不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4382559/

10-09 22:55