Вопрос о генерации кода времени компиляции - PullRequest
0 голосов
/ 29 июля 2010

У меня есть требование что-то вроде

void doSomeThing(int x)
{
.....
}

void fun()
{

 #ifdef XXXX_1_YYYY
doSomeThing(XXXX_1_YYYY);
 #endif //XXXX_1_YYYY

 #ifdef XXXX_2_YYYY
doSomeThing(XXXX_2_YYYY);
 #endif //XXXX_2_YYYY

 #ifdef XXXX_3_YYYY
 doSomeThing(XXXX_3_YYYY);
 #endif //XXXX_3_YYYY

 #ifdef XXXX_4_YYYY
 doSomeThing(XXXX_4_YYYY);
 #endif //XXXX_4_YYYY

....
upto XXXX_20_YYYY

}

Есть ли в любом случае, я могу уменьшить его до 20, используя какой-либо метод расширения макроса или любое другое решение?

Определение MACRO можетбыть примерно таким

#define XXXX_1_YYYY 10
#define XXXX_2_YYYY 20
#define XXXX_3_YYYY 30
#define XXXX_4_YYYY 40
...
#define XXXX_20_YYYY 200

Каждый из #ifdef не является взаимоисключающим.Код на с ++

Ответы [ 3 ]

0 голосов
/ 29 июля 2010

Я не вижу способа сделать это со стандартным препроцессором C.

Возможно, проблема может быть пересмотрена.Можете ли вы показать нам более широкий контекст?

И помните, что вместо злоупотребления препроцессором C вы всегда можете сгенерировать код с помощью другого инструмента, такого как m4, perl, bash и т. Д. Или JScript, VBScript и т. Д.на винде.Если ваша система сборки разрешает, то есть.

0 голосов
/ 29 июля 2010

Если есть специальное значение XXXX_n_YYYY (например, NULL для значения указателя, -1 для int и т. Д.), Вы можете использовать это специальное значение, чтобы пометить эту константу как «не определенную» (вместо того, чтобы оставить ее как неопределенную) , Тогда вы можете использовать некоторый код, который выглядит следующим образом:

void fun()
{
    size_t i;
    static XYXX_type job_que[] = { XXXX_1_YYYY, XXXX_2_YYYY, .... };

    for (i=0; i!=ARRAY_SIZE(job_que); ++i)
    {
        if (job_que[i] != SPECIAL_VALUE) do_something(job_que[i]);
    }
}

Очень сложно придумать что-то лучше с заданным количеством деталей.

0 голосов
/ 29 июля 2010

Возможно, тривиальный ответ, но если они все взаимоисключающие, то использование #elif сэкономит вам много # endifs.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...