Я ищу исходный код FFmpeg, и мне кажется странным использовать такой странный код:
#define MACRO 0
void func(void)
{
if (MACRO)
{
//code
}
}
Есть ли причина использовать «if» вместо «#if ... #endif» при работе с макросами?
Некоторые примеры этого в репозитории ffmpeg
Why ffmpeg developers using "runtime if" with macrofied condition
Причина в том, что макрос не является постоянное выражение, что можно оценить с помощью #if
. Может случиться так, что одна из констант, зависящих от архитектуры, не является (была) постоянным выражением во всех возможных путях.
bool do_we_have_mmx_function() {
__asm__("magic here");
}
#define HAVE_MMX do_we_have_mmx_function()
#if HAVE_MMX // invalid
if (HAVE_MMX) { // ok
должен дать тот же результат после оптимизации и убедиться, что код внутри блока
if
синтаксически действителен