LINUX.ORG.RU

Сделать #ifdef внутри макроса или как-то это обойти

 


0

1

Всем привет.

Пишу код, внутри есть логирование вида:

#define LOG(a) clog<<a<<endl;
...
#define DEBUG
...
#ifdef DEBUG
  LOG("Log message");
#endif
...
#undef DEBUG

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

Если честно, немного надоедает каждый раз писать #ifdef ... #endif , хочется засунуть это в макрос LOG, но, как я понял, этого сделать нельзя. Или можно?

Как засунуть условие #ifdef в макрос? Или какой может быть альтернативное решение, которое позволило бы логировать определенный участок кода?

Спасибо.

★★★★★

#ifdef DEBUG
#  define LOG(a) clog << a << endl
#else
#  define LOG(a)
#endif
Begemoth ★★★★★
()
Последнее исправление: Begemoth (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Begemoth)
Нет. Это включит/отключит логирование везде. А мне нужно, допустим, чтобы логи писались из одной функции.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от Kroz

Засунь это внутрь заголовочного файла (например, log.h). Использовать так:

/* Enable logging */
#define DEBUG
#include "log.h"

/* some code ... */

/* disable logging */
#undef DEBUG
#include "log.h"

/* some other code ... */

/* Enable logging again */
#define DEBUG
#include "log.h"
theNamelessOne ★★★★★
()

startlog.h

#define LOG(a) clog << a << endl
enablelog.h
#undef LOG
#define LOG(a)
disablelog.h
#undef LOG
#define LOG(a) clog << a << endl
example.c
#include "startlog.h"
...
#include "enablelog.h"
LOG("Лог включен. 1")
LOG("Лог включен. 2")
#include "disablelog.h"
LOG("Лог выключен")
...

anonymous
()
Ответ на: комментарий от Kroz

Как-то так

#define ENABLE_LOGGING 1
#define LOG_ENABLED(a) std::clog << a << std::endl
#define LOG_DISABLED(a) 
#define LOG BOOST_PP_IF(ENABLE_LOGGING, LOG_ENABLED LOG_DISABLED)
Begemoth ★★★★★
()
Ответ на: комментарий от anonymous

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

Kroz ★★★★★
() автор топика
Ответ на: комментарий от Kroz
#include <boost/preprocessor.hpp>

#define ENABLE_LOGGING 1
#define LOG_ENABLED(a) std::clog << a << std::endl
#define LOG_DISABLED(a)
#define LOG BOOST_PP_IF(ENABLE_LOGGING, LOG_ENABLED, LOG_DISABLED)

void foo()
{
        LOG(1);
        LOG(2);
#       undef ENABLE_LOGGING
#       define ENABLE_LOGGING 0
        LOG(3);
        LOG(4);
}
Begemoth ★★★★★
()
Ответ на: комментарий от Kroz

Нет. Это включит/отключит логирование везде. А мне нужно, допустим, чтобы логи писались из одной функции.

ну дык после функции переопределите макрос.

emulek
()
Ответ на: комментарий от Kroz
!/bin/bash

rm a.out 2>/dev/null
g++ -x c++ - <<EOF
#include <iostream>
#define LOG_ENABLE(a) a
#define LOG_DISABLE(a)
#define LOG(e,a) e(std::clog<<a<<std::endl);

int main() {
#define LS LOG_ENABLE
  LOG(LS,"msg1");
  LOG(LS,"msg2");
  LOG(LS,"msg3");
  LOG(LS,"msg4");
#undef LS
#define LS LOG_DISABLE
  LOG(LS,"msg5");
  LOG(LS,"msg6");
  LOG(LS,"msg7");
  LOG(LS,"msg8");
  return 0;
}
EOF
./a.out
anonymous
()
Ответ на: комментарий от anonymous
#include <iostream>
#define LOG_ENABLE(a) a
#define LOG_DISABLE(a)
#define LOG_(e,a) e(std::clog<<a<<std::endl);
#define LOG(a) LOG_(LS,a);

int main() {
#define LS LOG_ENABLE
  LOG("msg1");
#undef LS
#define LS LOG_DISABLE
  LOG("msg2");
  return 0;
}
anonymous
()
Ответ на: комментарий от theNamelessOne

Хитро. Работает. Спасибо.

Еще тогда, подскажи плиз, как единоразово отключить вот этот warnnig:

In file included from semantic.cpp:260:0:
log.h:4:0: warning: "LOG" redefined [enabled by default]
  #define LOG(a)
 ^
In file included from semantic.cpp:250:0:
log.h:2:0: note: this is the location of the previous definition
  #define LOG(a) clog<<__FILE__<<":"<<__LINE__<<": "<<a<<endl;
 ^
Вроде нашел #pragma warning (disable : код ) , но непонятно откуда взять код и как сделать единоразово (что-то про once, push находил, но так и не понял как его использовать.). Да и в мане на GCC нашел только -Wno-builtin-macro-redefined , что, как я понял, не совсем то.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от theNamelessOne

Все, решил с warning. Спасибо.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Суть уловил. Да, этот вариант мне больше нравится чем с заголовочным файлом. Спасибо.

Kroz ★★★★★
() автор топика
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от Begemoth

Оййй. Отложу себе в голове что в boost есть такая штука. Но пока здесь предложили варианты попроще. Все равно спасибо.

Kroz ★★★★★
() автор топика

Решение

В итоге сделал так:

#define LOG(a) 
#define LOG_ON(a) clog<<__FILE__<<":"<<__LINE__<<": "<<a<<endl;
...
// Включить логирование
#undef LOG
#define LOG(a) LOG_ON(a)
...
// Выключить логирование
#undef LOG
#define LOG(a) 

Всем спасибо!

Kroz ★★★★★
() автор топика
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от Kroz

Внутренне BOOST_PP_IF работает аналогично варианту анонимусов.

Begemoth ★★★★★
()
Ответ на: комментарий от anonymous
#include <iostream>

#define cat(a,b) a##b
#define xcat(a,b) cat(a,b)
#define LOG_ENABLE(a) a
#define LOG_LOGGING(a)
#define LOG_(e,a) e(std::clog<<a<<std::endl)
#define LOG(a) LOG_(xcat(LOG_,LOGGING),a)

int main() {
#define LOGGING ENABLE
  LOG("msg1");
#undef LOGGING
  LOG("msg2");
  return 0;
}
anonymous
()
Ответ на: комментарий от vtVitus

Это пушкой по воробьям. Мне нужно попроще.

Kroz ★★★★★
() автор топика
template<typename LogManager>
inline void Log(const LogManager& log_manager,/*some parameters*/)
{
  if(log_manager)
  {
     _Log(/*some parameters*/);
  }
}

LogManager определяет необходимость логгирования

const bool debug_serial = false;
const bool debug_gui = true;
const bool debug_some = true;

Log(debug_serial,"Bla-Bla-Bla");
Log(debug_serial,"Bla-Bla-Bla");
Log(debug_serial,"Bla-Bla-Bla");

Log(debug_gui,"Bla-Bla-Bla");
Log(debug_gui,"Bla-Bla-Bla");
Log(debug_gui,"Bla-Bla-Bla");

Log(debug_some,"Bla-Bla-Bla");
Log(debug_some,"Bla-Bla-Bla");
Log(debug_some,"Bla-Bla-Bla");
pathfinder ★★★★
()
Последнее исправление: pathfinder (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.