Флаги препроцессора против (например) логических флагов

Я знакомлюсь с научным кодексом гидродинамики. Код почти всегда использует директивы препроцессора, например.

#ifdef PARTICLES
    int nghost = 5
#else
    int nghost = 4
#endif

вместо более простых флагов C, например,

int nghost = 4;
if( particlesFlag ) { nghost = 5; }

Недостатком флагов препроцессора является то, что (в этой среде) он требует конфигурации (с созданием заголовочного файла) для каждой установки проблемы перед каждой сборкой, тогда как использование флагов c-кода потребует просто перекомпиляции.

Каковы преимущества этого подхода?

Кажется, что любое повышение эффективности было бы невероятно небольшим --- тем более, что этот код (например) запускается только один раз при инициализации программы, в то время как вся реальная работа выполняется в циклах на разных процессорах и т. д.


person DilithiumMatrix    schedule 08.02.2013    source источник


Ответы (1)


Скажем, у меня есть тысячи API, использующих nghost. Если PARTICLES уже определены, все эти переменные будут просто заменены на 5 или на 4 во время предварительной обработки.

Вы говорите об одном экземпляре, большой проект — это то, где полезна предварительная обработка.

Думать об этом.

int x() { int a = nghost *5; }
int ab() { return (nghost+10); }

Каждый раз, если он используется, его время выполнения потребляет

int x() { 
int a;
int nghost = 4;
if( particlesFlag ) { nghost = 5;}
a=nghost*5;
}


int ab() { 
int nghost = 4;
if( particlesFlag ) { nghost = 5;}
return (nghost+10); 

}

и так далее.

а еще подумайте об этом.

Предполагать

#ifdef PARTICLES
int nghost = 5
int aghost = 5
int bghost = 5
int cghost = 5
int dghost = 5
int eghost = 5
int fghost = 5
#else
int nghost = 4
int aghost = 4
int bghost = 4
int cghost = 4
int dghost = 4
int eghost = 4
int fghost = 4
#endif
person sr01853    schedule 08.02.2013
comment
Спасибо за ответ, но я немного запутался. В примерах, которые я привел, вы можете перевести первый в int nghost = 5 (если определено PARTICLES). Таким образом, единственная разница между двумя примерами заключается в том, выполняете ли вы оператор if...else... во время выполнения кода, верно? - person DilithiumMatrix; 08.02.2013
comment
когда вы говорите, если и еще, это во время выполнения, где ожидается, что ваша программа будет быстрой. . Предварительная обработка — это когда вы выполняете компиляцию и даже до нее в режиме реального времени. . - person sr01853; 08.02.2013
comment
Да, я понимаю. Чего я не понимаю, так это почему доступ к переменной (nghost) различается в двух случаях. т.е. чем бы int x() { int a = nghost *5; } отличалось, если бы nghost было определено через препроцессор, а не в коде? - person DilithiumMatrix; 08.02.2013
comment
время выполнения отличается от времени компиляции. . см. мой ответ для получения дополнительных разъяснений. Каждый раз вам нужно выполнять проверку if, тогда как при предварительной обработке это просто арифметика. .как 5*5 или 4*5 - person sr01853; 08.02.2013
comment
nghost определяется только один раз. Каждое использование nghost должно быть одинаковым независимо от двух приведенных выше реализаций, верно? - person DilithiumMatrix; 08.02.2013
comment
файл заголовка отличается от файла c. - person sr01853; 08.02.2013