Как распечатать заявление #define? - PullRequest
0 голосов
/ 21 декабря 2010

Как я могу заставить cerr напечатать 5 < 6 вместо statement_?У меня есть доступ к Boost и Qt.

using namespace std;

#define some_func( statement_ )               \
  if( ! statement_ )                          \
  {                                           \
    throw runtime_error( "statement_" );      \
  }                                           \

int main()
{
  try
  {
    some_func( 5 < 6 );
  }
  catch(std::exception& e)
  {
    cerr << e.what();
  }
}

Ответы [ 2 ]

4 голосов
/ 21 декабря 2010

Вам необходимо использовать оператор stringize:

throw runtime_error(# statement_);

Если statement_ может быть макросом, вам нужно использовать трюк с двойной строкой .

1 голос
/ 21 декабря 2010

О, я нашел это .

и вот окончательный рабочий код =):

#include <stdexcept>
#include <iostream>

#define some_func( statement_ )              \
  if( ! statement_ )                         \
  {                                          \
    throw std::runtime_error( #statement_ ); \
/* Note: #, no quotes!       ^^^^^^^^^^  */  \
  }                                          \

int main(int argc, char** argv)
{
  try
  {
    some_func( 5 < 6 );
  }
  catch(std::exception& e)
  {
    std::cerr << e.what();
  }
}
...