Question is related to release and debug build. Something related to this and this
But I have a simple doubt for example if I do following: (file is debug-test.c)
#include <stdio.h>
#define debug 1
int sum (int a, int b){
if (debug){
if (a > 0 && b > 0){
fprintf (stderr, "a(%d) >0 && b(%d)n", a,b);
}
}
return (a+b);
}
int main (void){
int a = 10, b = 5;
printf ("a:%d + b:%d = %dn", a, b, sum(a,b));
return 0;
}
So my doubt/question is if I do #define debug 0 will compiler eliminate/optimize out all the code (that if condition) from final binary? Or code will remain in final binary as
if (0){
.....
}
I have lots of testing and other code that just checks execution in various logical conditions.
What I tried is using gcc -S -Wall -Wextra debug-test.c once with debug set to 0 and once debug set to 1.
With debug set to 1 I get something like following:
.file "debug-test.c"
.text
.section .rodata
.LC0:
.string "a(%d) >0 && b(%d)n"
.text
.globl sum
.type sum, @function
sum:
.LFB0:
.cfi_startproc
When I set debug to 0 I get following
.file "debug-test.c"
.text
.globl sum
.type sum, @function
sum:
.LFB0:
.cfi_startproc
I do not really understand output of -S but cursory glance shows that
.string "a(%d) >0 && b(%d)n" is not present when I set debug to 0. Other simple thing that I checked is wc -l debug-test.s so for 0 it gives me 61 lines and for 1 it gives me 78 lines. I am not sure I really understand what is happening, will compiler eliminate code or keep it in binary?
Advertisement
Answer
if I do #define debug 0 will compiler eliminate/optimize out all the code (that if condition) from final binary?
Yes, if optimizations are enabled. I just tried your code on x86 gcc -O3 and it removed the whole function call with debug set to zero. Basically it just loads the numbers 5, 10 and 15 as parameters to printf then calls it, and that’s all the program does. https://godbolt.org/z/b3f17rqe4
An issue here is that the compiler might give you spurious warnings “condition is always false” and similar for if(0). Which is why #ifdef debug ... #endif is a better pattern to use.