6

I'm writing a C++ Program with Codeblocks and for debugging-purposes I need to know if the Building-Target of Codeblocks is set to "DEBUG" or to "RELEASE".

I already tried this:

#ifdef DEBUG
    printf("Debug-Message");
#endif

and this

#ifdef _DEBUG
    printf("Debug-Message");
#endif

But none of this words are defined. Do I have to define DEBUG on my own and change it, everytime I change the Building-Target, or is there a word I don't know?

1
  • Don't forget to end your debug format strings with \n Commented Oct 20, 2012 at 11:29

2 Answers 2

6

Do I have to define DEBUG on my own and change it, everytime I change the Building-Target, or is there a word I don't know?

I don't know what, if anything is set by default by Code::Blocks. But, if you define your own #defines

Project->Build options...->[Debug|Release]->#defines 

you don't have to change them as you switch between build targets (DEBUG or RELEASE). It lets you define values that are specific to the Debug build, as well as values that are specific to the Release build.

To avoid having to manually enter it each time for each new project you can make a small project with just your Debug/Release #defines and save that as a project template and then create new projects from that project template.

Sign up to request clarification or add additional context in comments.

1 Comment

CodeBlocks really should define these since its Debug/Release aware. And it should change assert's behavior from the abort to a trap when under a Debug configuration. It makes absolutely no sense to abort a program while under the debugger. I am amazed at how many people don't use asserts because of dumb committee decisions.
3

The usual way, as suggested by assert(3) man page and habits (with <assert.h> in C or <cassert> in C++), is to define NDEBUG at the command line (e.g. to compile with gcc -Wall -DNDEBUG) for non-debug compilation. In your Makefile you could CPPFLAGS += -DNDEBUG in release mode (and compile with g++ -Wall -g in debug mode).

My own habit might be to have something like

#ifndef NDEBUG
#define dbgprintf(Fmt,...) do{fprintf(stderr,"%s:%d:" Fmt "\n", \
                               __FILE__, __LINE__, \ 
                              ##__VA_ARGS__);}while(0)
#else
#define dbgprintf(Fmt,...) do{}while(0)
#endif

in a common header file, and to use dbgprintf("i=%d", i) elsewhere in the code. Notice that I use constant string catenation on the Fmt macro argument, that I append a constant newline to it, and that my debugging output contains the source file name and line number (you might also use __func__ if you like). In pure C++ code, I might instead have

#ifndef NDEBUG
#define DBGOUT(Out) do{std::out << __FILE__ << ":" << __LINE__ \
                       << " " << Out << std::endl;}while(0)
#else
#define DBGOUT(Out) do{}while(0)
#endif

and use DBGOUT("i=" << i) with the advantage of using specific definitions of operator << for my types.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.