Удалить функцию во время препроцессора

У меня есть единственная функция для отладки сообщений, используемая во всем проекте. Когда KEYDEBUG определяется как 1 или 0, функция включается или отключается по мере необходимости.

#define KEYDEBUG 0

void debugging(int var){
   #if KEYDEBUG
   //Утверждать
   #endif
}

При проверке компилятора переменная var выдает предупреждение -Wunused-parameter. Как убрать это предупреждение именно в этой части проекта? Или какая другая альтернатива использованию отладочного кода и его удалению из памяти для производственной версии?

, 👍2


1 ответ


Лучший ответ:

2

В вашем случае вы не используете все тело, поэтому можете использовать макрос.

Таким образом, код, когда KEYDEBUG равен 0, будет выглядеть так, как если бы полная функция не существовала (за исключением приведения типа void, см. ниже).

#include "assert.h"

#define KEYDEBUG 0

#ifndef KEYDEBUG
#define debugging(x) void(x);
#endif


void debugging(int var){
   assert(var);
}

void setup() {
  // put your setup code here, to run once:
  debugging(1);
}

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

Неиспользуемый атрибут

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

#if KEYDEBUG
   void debugging(__attribute__((unused)) int var){
      //Утверждать
#else
   void debugging(int var){
      //Утверждать
#endif
   } 

или, если вы предпочитаете лучшую читабельность:

#if KEYDEBUG
   void debugging(__attribute__((unused)) int var){
      //Утверждать
   }
#else
   void debugging(int var){
      //Утверждать
   }
#endif

Приведение к пустоте

Менее чисто, но работает:

void debugging(int var){
   #if KEYDEBUG
      //Утверждать
   #else
      (void) var; // предупреждение о неиспользуемом параметре
   #endif
}

Макросы/параметры

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

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

,

Можно ли полностью удалить функцию отладки и ее вызовы, не касаясь «отладочных» вызовов?, @Brethlosze

Не полностью, ну в макросе, который я определил, вызов функции заменен на void cast, так что это не функция, и отладочные вызовы трогать не надо., @Michel Keijzers