2010-12-07 8 views
1

私はこの二つのマクロ書いている:最初のマクロは、(私が試した場合に)うまく機能Cマクロ:関数ファクトリ、なぜマクロが1つのケースでしか動作しないのですか?


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

が、2番目のマクロ... doesnの'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) 

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'の場合はうまく動作します)。

ありがとうございます。

答えて

2

マクロのパラメータnとマクロの本体に関数のパラメータint nがありますので、int intになります。

3

あなたはまた、マクロを展開した後、「コンパイル」を停止し、得られたコードをチェックするためにはgccを伝えることができ

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)); \ 
} 

作成することになり

// _GENERIC_ASSERT_EQ_VECTOR_CONSTRUCTOR_(int, INT, Int, int) // Here i have an error 
    _GENERIC_ASSERT_EQ_VECTOR_CONSTRUCTOR_(integer, INT, Int, int) 
//         _____^^^^^^^_____ 

元のマクロの展開をお試しください。

gcc -E source
+0

感謝してみてください、それは本当だ:) – castarco