Trouble understanding preprocessor directives

Im trying to set 3 different debugging levels. Ive been trying every possible combination and reading different books for days but im still not getting it sorry. Can anyone show me the proper way to set 3 different debug levels? Thanks.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>

using namespace std;
enum DEBUGLEVEL { LOW,HIGH,MEDIUM};

#define DEBUGLEVEL HIGH

int main()
{

#if DEBUGLEVEL == 0
cout << "Debug level 0\n";
#elif DEBUGLEVEL == 1
cout << "Debug level 1\n";
#else
cout << "Debug level 2\n";
#endif

}
closed account (1vRz3TCk)
Something like:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define low 1
#define med 2
#define high 3

#define debug high

#include <iostream>

int main()
{
#if debug == low
	std::cout << "Debug low";
#elif debug == med
	std::cout << "Debug med";
#elif debug == high
	std::cout << "Debug high";
#else
	std::cout << "Debug off";
#endif
}
less is more when it comes to macros. Nothing here needs a macro conditional chain:
(For no good reason I fixed the order of low/med/high to be human-expected)

given the nature of what this IS, a numeric value is probably sufficient?
1
2
3
4
5
6
7
8
9
enum DEBUGLEVEL { LOW,MEDIUM,HIGH, max_dl};
const string levels
#define DEBUGLEVEL HIGH

int main()
{
    cout << "debug level is:" << DEBUGLEVEL << endl;
}


or, if you MUST have some text, the old enum to text problem...
1
2
3
4
5
6
7
8
9
10
enum DEBUGLEVEL { LOW,MEDIUM,HIGH,MAXDL};
const string levelz[MAXDL] = {"LOW","MEDIUM","HIGH"};
#define DEBUGLEVEL HIGH

int main()
{
cout << "debug level is:" << levelz[DEBUGLEVEL] << endl;

}


for extra credit take the #define DEBUGLEVEL HIGH out of the code and put it in the project. HIGH won't exist there so you have to use the number.
Last edited on
closed account (1vRz3TCk)
I took it that the OP wants to do some conditional compilation rather than just change a bit of text.
something like this

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<iostream>
 
#define NONE 0
#define LOW 1
#define MEDIUM 2
#define HIGH 3
 
#define DEBUGLEVEL HIGH
 
#if DEBUGLEVEL == NONE
#define ASSERT(x) \
cout << "Debug level NONE\n";
 
#elif DEBUGLEVEL == LOW
#define ASSERT(x) \
std::cout << "Debug level LOW\n"; \
if (!(x)) \
{ \
std::cout << "Error ! Assert failed ! " <<#x<<"\n"; \
std::cout << "On line "<<__LINE__ << "\n"; \
std::cout << "In file " << __FILE__<< "\n"; \
} \
else \
std::cout << "Success. " << #x << "\n"; \
 
#elif DEBUGLEVEL == MEDIUM
#define ASSERT(x) \
std::cout << "Debug level MEDIUM\n"; \
if (!(x)) \
{ \
std::cout << "Error ! Assert failed ! " <<#x<<"\n"; \
std::cout << "On line "<<__LINE__ << "\n"; \
std::cout << "In file " << __FILE__<< "\n"; \
} \
else \
std::cout << "Success. " << #x << "\n"; \
 
#elif DEBUGLEVEL == HIGH
#define ASSERT(x) \
std::cout << "Debug level HIGH\n"; \
if (!(x)) \
{ \
std::cout << "Error ! Assert failed ! " <<#x<<"\n"; \
std::cout << "On line "<<__LINE__ << "\n"; \
std::cout << "In file " << __FILE__<< "\n"; \
} \
else \
std::cout << "Success. " << #x << "\n";  \
 
 
 
#else
std::cout << "Debug OFF.\n";
#endif
 
int main()
{
int x = 5;
std::cout << "First assert.\n";
ASSERT (x == 5);
std::cout<<"Second assert\n";
ASSERT(x!=5);
std::cout<<"Done.\n";
}
Last edited on
Do you still have a question there? Apart from low/med/high being identical apart from their level, it looks good to me, does it work, and if not, what is the issue?


Topic archived. No new replies allowed.