2010-07-29 2 views
0

У меня есть требование что-то вродеВопрос о генерации кода времени компиляции

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 не являются взаимоисключающими. Код в C++

+0

Дополнительная информация plz, что вы пытаетесь сделать? – matt

+0

Это версия «c» Boost? –

+0

@Will Dean: хорошо, так что, возможно, нет верификации c, но вы, вероятно, могли бы просто скопировать все свои препроцессорные вещи ... это тот же препроцессор? во-вторых, оригинальные теги для этого вопроса были просто шаблонами «макросов». Я собирался что-то сказать, не знаю, ПОЧЕМУ, парень изменил его ... так что да, я уверен, что он использует C++ – matt

ответ

0

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

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

0

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

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

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

0

Если есть специальное значение 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

I хотите, чтобы это время компиляции, а не время запуска – user405369

+0

В этом случае см. комментарий мата выше. Тот, который у вас есть, - это лучшее, что вы можете достичь. С C++ вы можете использовать do_something (void) перегрузку с пустой функцией и определять неопределенные, чтобы быть ничем (чтобы предотвратить ошибки), вы можете сделать тот же цикл без if и массива, но это лучшее, что я могу придумать с. – vhallac

Смежные вопросы