#define definer(x) #define #x?
# x является строкой x. Вы не можете # определить строковый токен. (#define "foo".) Это должен быть идентификатор [a-zA-Z0-9 _] * токен.
Вы не можете nest # определить, как это. Вы не можете иметь #define в # define.
Вы можете иметь # if внутри #if блоков.
#ifdef FOO
#ifdef BAR
...
#else // BAR
...
#endif // BAR
#else // FOO
...
#endif //FOO
Вы также несколько ограничены в выражениях, которые вы можете использовать в #if макросах. Но иногда вы можете обойти это. Например:
/* Use CONCATENATE_4_AGAIN to expand the arguments to CONCATENATE_4 */
#define CONCATENATE_4( a,b,c,d) CONCATENATE_4_AGAIN(a,b,c,d)
#define CONCATENATE_4_AGAIN(a,b,c,d) a ## b ## c ## d
/* Creates a typedef that's legal/illegal depending on EXPRESSION. *
* Note that IDENTIFIER_TEXT is limited to "[a-zA-Z0-9_]*". *
* (This may be replaced by static_assert() in future revisions of C++.) */
#define STATIC_ASSERT( EXPRESSION, IDENTIFIER_TEXT) \
typedef char CONCATENATE_4( static_assert____, IDENTIFIER_TEXT, \
____failed_at_line____, __LINE__ ) \
[ (EXPRESSION) ? 1 : -1 ]
Плюс что-то вроде:
STATIC_ASSERT( sizeof(int1) == 1, sizeof_int1_equal_1 );
(Да, я знаю о # include . Это всего лишь пример.)