неопределить макрос при исполнении в C - PullRequest
0 голосов
/ 17 мая 2019

Можно ли отменить определение макроса во время выполнения?Вот что я попробовал:

for(int i=2; i<argc; i++){
    if(strcasecmp(argv[i], "+debug")==0){
        puts("+debug");
#ifndef DEBUG
#define DEBUG
#endif
    }
    if(strcasecmp(argv[i], "-debug")==0){
        puts("-debug");
#ifdef DEBUG
#undef DEBUG
#endif
    }

Я скомпилировал код с определенным макросом DEBUG.Что он делает, он будет отображать все сообщения на стандартный вывод.Если не определен, он не будет отображать эти сообщения.Поэтому, когда я запускаю приложение с параметром -debug, оно должно отменять определение макроса.Но это не так!Я все еще получаю сообщения на консоли!

Кто-нибудь хочет помочь?

Ответы [ 4 ]

5 голосов
/ 17 мая 2019

Все директивы препроцессора (#...) выполняются перед компиляцией на шаге препроцессора, который преобразует исходный исходный код в исходный код, готовый для компиляции. Полученный (преобразованный) исходный код больше не содержит никаких директив препроцессора. Таким образом, невозможно взаимодействовать с директивами препроцессора, за исключением изменения исходного кода и перекомпиляции программы.

5 голосов
/ 17 мая 2019

Нет, ты не можешь. Макросы заменяются на этапе препроцессора , поэтому никогда не включайте его в конечную программу.

1 голос
/ 17 мая 2019

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

Если вы хотите переключать отладочную информацию во время выполнения, вам нужна конфигурация времени выполнения, напримерпеременная.Вы можете использовать макросы препроцессора для установки значения по умолчанию.

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

#ifdef DEBUG
int debug = 1; /* default is ON */
#else
int debug = 0; /* default is OFF */
#endif

    for(int i=2; i<argc; i++){
        if(strcasecmp(argv[i], "+debug")==0){
            puts("+debug");
            debug = 1; /* change value at run time */
        }
        if(strcasecmp(argv[i], "-debug")==0){
            puts("-debug");
            debug = 0; /* change value at run time */
        }

/* ... */


/* instead of 

#ifdef DEBUG
   do_debug_stuff();
#endif

you would have to use */
   if(debug) {
      do_debug_stuff();
   }
0 голосов
/ 17 мая 2019

Можно ли отменить определение макроса во время выполнения?

Ответ прост: "Нет пути"

Как можно ожидать, что это произойдет.

Директивы препроцессора Infact обрабатываются еще до компиляции.

...