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 = %d\n", 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?