Препроцессор C: #define in C ... advice - PullRequest
0 голосов
/ 26 мая 2010

Я делаю большой C проект и никогда раньше не сталкивался с подобной ситуацией, поэтому мне нужен ваш совет.

Каково ваше мнение? Можно ли определять константы в условных препроцессорах так, как я это сделал ниже, или вы советуете мне сделать это другим способом?

#define NUM_OCTAVES_4
//#define NUM_OCTAVES_5

    #ifdef NUM_OCTAVES_4
     #define OCTAVES 4
     const unsigned char borders [4] = {11, 26, 50, 98};
    #elif NUM_OCTAVES_5
     #define OCTAVES 5
     const unsigned char borders [5] = {11, 26, 50, 98, 194};
    #endif

Есть ли недостатки, если я сделаю это таким образом?

Ответы [ 5 ]

4 голосов
/ 26 мая 2010
#define OCTAVES 4

#if OCTAVES == 4
 const unsigned char borders [4] = {11, 26, 50, 98};
#elif OCTAVES == 5
 const unsigned char borders [5] = {11, 26, 50, 98, 194};
#endif
1 голос
/ 26 мая 2010

Это больше СУХОЙ , то есть менее повторяющееся, чтобы быть немного умнее:

#define OCTAVES 4
/*define OCTAVES 5 */

 const unsigned char borders [] = {11, 26, 50, 98,
#if OCTAVES == 5
  194
#endif
 };

Таким образом, вам не нужно, чтобы четыре первых значения были одинаковыми в двух «ветвях» кода.

Или, если вы обнаружите это оскорбление, выделите его в макрос и повторите вместо этого:

#define BORDERS4 11, 26, 50, 98

#if OCTAVES == 4
const unsigned char borders[] = { BORDERS4 };
#else if OCTAVES == 5
const unsigned char borders[] = { BORDERS4, 198 };
#endif
1 голос
/ 26 мая 2010

Почему бы просто не иметь "5" версию массива, а затем int noctaves = 4; или каким-либо другим способом игнорировать последнюю октаву, если вы хотите только 4?

1 голос
/ 26 мая 2010

Является ли октавы 4/5 настолько важными, что вы собираете разные версии приложения? Если бы вы продавали, это был бы другой продукт?

Правильным способом было бы выделить границы во время выполнения с помощью malloc, но если это всего лишь простое упражнение, вы не захотите узнать об этом пока.

Или вы можете сделать границы [5] и установить последнее значение равным 0 или какое-нибудь легко обнаруживаемое значение конца октав.

1 голос
/ 26 мая 2010

Конечно, все в порядке. Это точка условной компиляции.

...