Подтвердить что ты не робот

Простые способы отключения частей кода

Это не типичный вопрос для решения конкретной проблемы, это скорее мозговое упражнение, но мне интересно, есть ли у кого-нибудь решение.

В разработке нам часто приходится отключать или переключать некоторые части кода, чтобы проверить разные подходы. Для этого мы используем комментарии или #defines, но мой любимый:

//*
[code here]
//*/

Теперь, когда вы удаляете только первую косую черту, код будет закомментирован.

Вопрос: есть ли способ реализовать аналогичный кодовый переключатель if-else? Я пытался найти его, но у меня всегда была проблема, и я не мог найти рабочего решения.

И, может быть, вы знаете какие-либо подобные трюки?

4b9b3361

Ответ 1

Я не уверен, что должен опубликовать это, потому что это не то, что я считаю "хорошим кодом", но я признаю, что использовал следующий метод как быстрый n-грязный способ быстро переключаться между два небольших фрагмента кода, когда я просто что-то проверяю:

// in the following , foo() is active:
/**/ foo(); /*/ bar(); /**/

Теперь просто удалите одну из звездочек спереди:

// now bar() is active:
/*/ foo(); /*/ bar(); /**/

Конечно, это никогда не должно проходить мимо фазы "просто проверять вещи"...

Ответ 2

Обертка кода с помощью #if 0 делает трюк, но затем вам все равно нужно отредактировать код, чтобы включить/отключить его. Это не намного лучше, чем просто использование блока комментариев.

Обратите внимание, что вы также можете использовать определенную константу препроцессора:

#ifdef ENABLE_TESTS
// code that you want to run ONLY during tests 
#endif

Теперь, когда вы создаете код, вы можете выборочно определить/удалить эту константу в процессе сборки - IDE/makefile/build script/command-line - без необходимости редактировать код:

$ gcc -DENABLE_TESTS source.c

Я добавил этот ответ, чтобы сбалансировать все ранние ответы #if 0, но эта конструкция из принятого ответа является лучшим ответом на конкретный вопрос: /**/ foo(); /*/ bar(); /**/. Пожалуйста, используйте такие трюки комментариев экономно.

Ответ 3

#if 0
...disabled code here
#endif

Ответ 4

Препроцессор if-else также работает

#if 1
  // ... enabled if 1
#else
  // ... enabled if 0
#endif

Ответ 5

Иногда я использую трюк ниже, чтобы переключаться между двумя ленивыми комментариями.

//* <-- remove the first slash
[code block 1]
/*/
[code block 2]
//*/

Ответ 6

Ну, если код, который необходимо отключить один раз или дважды до финализации, я предпочитаю использовать горячие клавиши, предоставленные IDE, чтобы прокомментировать этот код, а затем комментарий. Да, сначала мне нужно сначала выбрать блок кода, но я предпочитаю не включать еще одну директиву для отладки/инструкции препроцессора /if каждый раз, когда мне нужно отключить часть кода. Это происходит большую часть времени.

Если, с другой стороны, мне нужно многократно переключаться между двумя кодовыми блоками, чтобы найти нужную вещь, тогда я использую if (0)/if (1) для блокировки/включения кода.

[code block 1]

Далее

if (0)
{
    [code block 1]
}
else
{
    [code block 2]
}

Ответ 7

Используйте некоторую логику препроцессора, чтобы помочь вам здесь:

#if 0
    //code goes here
#endif

Enjoy

Ответ 8

Если вы выполняете проверки во время компиляции, вы можете использовать ответ Gigi, который условно не будет компилировать разделы кода. Обратите внимание, что препроцессор не знает переменные или sizeof или другие вещи, обработанные компилятором (поэтому использование чего-то типа 4 == sizeof(int) не будет летать)

Если вы хотите скомпилировать небольшие фрагменты кода отладки, которые не должны запускаться, вы можете использовать регулярные условные операторы, такие как

bool debugging = false;

// banana banana banana

if (debugging)
{
    // do a bunch of stuff here
}

Затем вы можете использовать отладчик для доступа к пропущенному разделу, назначив debugging true.

Ответ 9

Макро это способ сделать это.

#define COMPILE 

#ifdef COMPILE

//code to comment begins
cout<<"ha ha ha"<<endl;
//code to comment ends 

#endif

Чтобы отключить код, просто закомментируйте строку #define compile

Ответ 10

1 ? foo() : bar();

Выполняется foo(). Измените 1 на 0, чтобы выполнить bar().

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

Ответ 11

Иногда требуется также синхронное включение/выключение фрагментов кода, разбросанных по программе.

Вдохновленный этим более ранним сообщением Грэма, я приготовил что-то вроде этого:

void doNothing(){}
#define DO_IF(flag, code) flag ? code : doNothing();

Это можно использовать, например, следующим образом:

DO_IF(collectStats, recordStats());
DO_IF(collectStats, store(pullStat()));

А это еще лучше:

#define DO_IF(flag,code) if( flag ) { code; }

Ответ 12

следующая логика должна содержать простейший подход

if(isMode1)
{
    //Code for mode1
}
else
{
    //Code for other modes
}

хотя я думаю, что правильный способ - использовать Директивы PreProcessor

Ответ 13

В моем коде мне нравится делать это в файле main.cpp:

#define CRAZY_EXPERIMENT

#ifdef TEST
#include "Test.h"
#elif ANOTHER_TEST
#include "AnotherTest.h"
#elif CRAZY_EXPERIMENT
#include "CrazyExperiment.h"
#else

int main(int argc, int * argv[]){
    runTheProgramLikeNormal();
}

#endif

Файлы заголовков, которые вы видите, содержат свои собственные main(). В программе есть только одна функция main(), основанная на том, что определено в первом #define. Если инструкция полностью опущена, по умолчанию используется каноническая функция main(), которую вы видите в записи.

Это упрощает запись тестов для моей программы, которые сосредоточены только на одном или двух компонентах. И лучшая часть состоит в том, что тестовые заголовки аккуратно помещаются на карантин из моего кода, поэтому никакой код теста не остается в (или даже связанном) по ошибке.