Как я могу удалить дублирование между этими макросами C?

У меня есть пара следующих макросов препроцессора C для создания тестовых функций:

// Defines a test function in the active suite
#define test(name)\
    void test_##name();\
    SuiteAppender test_##name##_appender(TestSuite::active(), test_##name);\
    void test_##name()

который используется так:

test(TestName) {
    // Test code here
}

и

// Defines a test function in the specified suite
#define testInSuite(name, suite)\
    void test_##name();\
    SuiteAppender test_##name##_appender(suite, test_##name);\
    void test_##name()

который используется так:

test(TestName, TestSuiteName) {
    // Test code here
}

Как я могу убрать дублирование между двумя макросами?


person Matthew Murdoch    schedule 19.05.2009    source источник


Ответы (2)


#define test(name) testInSuite( name, TestSuite::active() )

Однако это не уменьшает количество испускаемого C и машинного кода, а только удаляет логическое дублирование.

person sharptooth    schedule 19.05.2009
comment
Это работает? Я думал, что препроцессор расширяет макросы за один проход ... - person Matthew Murdoch; 19.05.2009
comment
@Matthew: Макросы раскрываются, хотя это возможно, но не за один проход, поэтому цепочки зависимых макросов возможны и могут использоваться для создания едва отлаживаемого кода. @Skizz: Верно, исправил. @Neil Butterworth: Верно насчет сгенерированного кода, и я согласен с вами, что эту проблему вряд ли можно решить. Но логическое дублирование элегантно устранено. - person sharptooth; 19.05.2009
comment
Я думал, что уже безуспешно пробовал это, но я был явно сбит с толку! Если вы удалите конечную точку с запятой, я приму этот ответ. Спасибо. - person Matthew Murdoch; 19.05.2009
comment
также важно, что макрос не может быть заменен сам по себе: #define X (A) X (A) не вызовет бесконечную рекурсию :) - person Johannes Schaub - litb; 20.05.2009

Пытаться:

#define test(name) testInSuite (name, TestSuite::active())
person Skizz    schedule 19.05.2009