Цитата(amw @ Aug 27 2008, 23:35)

Разворачивается препроцессором так
Код
typedef int my_assert___LINE___h[(10 == 10)?1:0];
typedef int my_assert___LINE___h[(sizeof(int) == 2)?1:0];
В результате дважды объявлен тип my_assert___LINE___h
да, забыл про дополнительный уровень вложенности.
гнутые компиляторы, дополнительно требуют отрицательный размер массива для ошибки.
примерно такой код использовал в keil, icc, gcc, bcb.
#define MY_JOIN_3_H(A,B,C) A##B##C
#define MY_JOIN_3(A,B,C) MY_JOIN_3_H(A,B,C)
#define MY_ASSERT_H(A) typedef int MY_JOIN_3(my_assert_,__LINE__,_h) [(A) ? 1 : -1]
#define MY_ASSERT(A) MY_ASSERT_H(A)
#define MY_SOME_C 10
MY_ASSERT(MY_SOME_C == 10);
MY_ASSERT(sizeof(int) == 2);