Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C or C++ Return Status

What are the best practices for writing C or C++ functions that return an int that represents a status code?

Specifically, I want to know about the client usage but other tips are welcome.

For example, can I write something like this:

int foo() {
  return 0;  // because everything was cool
}

And then use it like this?

if (foo()) {
  // what to do if false, e.g. non-zero, e.g. not OK
} else {
  // what to do if true, e.g. zero, e.g. OK
}

This should work because best practices typically dictate that a status code of 0 means everything was OK and also 0 means false in a boolean statement.

However, this wouldn't be good, right:

if (!foo()) {
  // what to do if true
} else {
  // what to do if false
}
like image 642
Jason Marcell Avatar asked Sep 16 '11 20:09

Jason Marcell


2 Answers

We use this in C where I work:

int err = foo();
if (err) {
    // armageddon
}

The assignment and if could be combined, but with more complicated function calls it gets more confusing and some people are confused by assignment in a conditional (and gcc hates it).

For C++, I would prefer exceptions if available, otherwise the above.

Edit: I would recommend returning 0 on success and anything else on error. This is what unix command line utilities do.

like image 91
Oscar Korz Avatar answered Sep 28 '22 13:09

Oscar Korz


If you really want to use status codes that way, use them with an enum or block of #define statements that describe the intention of the status code.

For example:

enum
{
   kSuccess = 0,
   kFailure = -1,
}

function foo()
{
    return kSuccess;
}

if (kSuccess == foo())
{
    // Handle successful call to foo
}
else
{
    // Handle failed call to foo
}

This way, the intention is clear and there's no error-prone guesswork when someone wants to use or maintain your code in the future.

like image 43
adpalumbo Avatar answered Sep 28 '22 12:09

adpalumbo