954,480 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

easy printf() alternative in C++?

Hi!

I've recently converted some C code to a bit more native C++. This included changing printf() statements to std::cout statements. However, some printf()'s are rather lengthy and annoyingly long (and human-error-prone) to write in std::cout. Example (and this one is a short one):

C-style:

printf("ERROR %d: %s: %s\n", event, origin ? origin : "?", fulltext.c_str());


C++-style:

std::cout << "ERROR " << event << ": " << origin ? origin : "?" << ": " << fulltext << "\n";


I personally find the first way much more clear and easier to write. What is the recommended way to do this in C++?

nightcracker
Newbie Poster
3 posts since Dec 2010
Reputation Points: 10
Solved Threads: 0
 

Well, considering that this is an error report, you may want to consider try/catch blocks and exceptions :

try {
  //some code
  //some code
  //ERROR
  throw errorType
} catch (const errorType &e) {
  cout << "ERROR: " << e.what() << endl;
}
Fbody
Posting Maven
2,930 posts since Oct 2009
Reputation Points: 833
Solved Threads: 393
 

Well you could just put a bit more "style" into it:

std::cout << "ERROR " << event 
          << ": "     << (origin ? origin : "?") 
          << ": "     << fulltext 
          << std::endl;

It takes more lines of code, but it is worth it in terms of clarity.

If you have code like this that gets repetitive, like an error report that is basically always "event" "origin" "message", then just make a function for that:

inline void report_error(int event, const std::string& origin, const std::string& message) {
  std::cout << "ERROR " << event 
            << ": "     << (origin ? origin : "?") 
            << ": "     << message 
            << std::endl;
};


Or use a MACRO like this:

#define ERROR_REPORT(A,B,C) "ERROR " << A << ": " << (B ? B : "?") << ": " << C

//and use it as:
std::cout << ERROR_REPORT(event,origin,fulltext) << std::endl;


Or use exception messages as Fbody said.

Or, just use printf, if you prefer, there's nothing really wrong with that. You should always consider the C++ options first because they are often better, but wherever the C style works fine, it's ok too (as long as it is within a small piece of code that is well encapsulated).

mike_2000_17
Posting Virtuoso
Moderator
2,134 posts since Jul 2010
Reputation Points: 1,634
Solved Threads: 457
 

In this case it was an error report, but I write printf() in general MUCH faster then std::cout. Perhaps it's habit that will go away after a while.

nightcracker
Newbie Poster
3 posts since Dec 2010
Reputation Points: 10
Solved Threads: 0
 

Your eyes will also get used to the C++ version with time. For instance, I find the C++ version you posted more appealing to the eye. And your fingers will also get used to it, believe me.

mike_2000_17
Posting Virtuoso
Moderator
2,134 posts since Jul 2010
Reputation Points: 1,634
Solved Threads: 457
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You
View similar articles that have also been tagged: