Сгенерируйте предложение #ifdef, #endif с другим макросом - PullRequest
1 голос
/ 25 января 2011

У меня проблема в программе, над которой я работаю.Я пытаюсь в --help, чтобы показать, какие функции собраны или нет.Однако их довольно много, и «нормальный» путь слишком многословен.Например:

#ifdef HAVE_FOO
static const bool have_foo = true;
#else
static const bool have_foo = false;
#endif
printf("Support for foo: %s\n", have_foo ? "yes" : "no");

Теперь, поскольку я должен делать это в основном для каждой функции, это будет множество строк, которые мне не нужны.некоторые макросы для этого:

#define _SUPP(X) #ifdef HAVE_##X \
static const bool _##X##_SUPP = true; \
#else \
static const bool _##X##_SUPP = false; \
#endif

#define _PRINTSUPP(var, name, desc) printf("\t%s - %s: %s\n", name, desc, _##var##_SUPP ? "yes" : "no")

Однако здесь есть проблема.Макрос будет расширен до одной строки, и препроцессор захлебнется этим.Есть ли способ генерировать макрос с реальными символами новой строки между ними, или можно вычислить #ifdef в одной строке?

Ответы [ 3 ]

3 голосов
/ 25 января 2011

Если вместо определения HAVE_FOO вы определите его как 0, вы можете сделать:

const struct {
    bool present;
    const char *name;
} features[NFEATURES] = {
    {HAVE_FOO, "foo"},
    {HAVE_BAR, "bar"},
    ...
};

for (size_t i=0; i < NFEATURES; i++)
    if (features[i].present)
        printf(" ... and we've got: %s\n", features[i].name);

Затем вам нужно будет проверить #if HAVE_FOO вместо #ifdef HAVE_FOO, и ваше сообщение --help может отображаться немного медленнее, если число ваших функций будет исчисляться миллионами (в этом случае я бы порекомендовал в любом случае другая архитектура).

2 голосов
/ 25 января 2011

Вы не можете сделать это в C. Обычный подход - генерировать такой заголовок из некоторого текстового описания, скажем, в Perl или Python.

0 голосов
/ 25 января 2011

Вы не можете использовать макрос для создания другой директивы предварительной обработки. Все директивы предварительной обработки распознаются до начала раскрытия макроса, поэтому ваш макрос будет интерпретироваться как ошибочный код Си.

...