Finally! The provisional PDF is a bit ugly, mainly due to the oversized figures. O well.
It was a fun 5 months... (finishing writing --> final acceptance.)
More C++ help needed
OK, here's a silly C++ problem I'm having. (Again, it has to do with exceptions -- is there a book that someone can recommend on "practical C++ programming" or something? 'cause Stroustrup is a decent reference but is shite for learning about the nooks & crannies of the language...)
Here's the code:
int line_no;
if (success) {
...
} else {
std::string exc_str;
exc_str += "failure at line ";
exc_str += line_no;
exc_str += "; aborting.";
printf("exception is: %s\n", exc_str.c_str());
throw (my_exception(exc_str));
}
When this code is compiled and placed in a shared library file (by Python distutils on Linux/gcc 3.3.2), I get an odd result: the printf output (and the string passed into
my_exception) is NOT what is constructed in the above 'else' code. In fact, if I do anything other than assign a constant string to 'exc_str' I get essentially random output.
I don't think it's a simple scoping issue, because my_exception is making a new copy of exc_str. I think it's related to the shared-librariness aspect of the code. Is there some gcc flag I (or distutils) am missing?
Oh, and one more question: is using '+' the right way to construct the exception report string? It's kinda ugly.
E-mail me... thanks!
Update: The enigmatically named 'tk' pointed out that operator+ interprets the integer as an ASCII code. Whups. He gave me this bit of code instead:
#include <cstdio> #include <sstream> #include <string>
void foo() { std::ostringstream exc_str; exc_str << "failure at line " << 10 << "; aborting."; printf("exception is: %s\n", exc_str.str().c_str()); }
This is exactly what I was looking for -- thanks, tk!
--titus
