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?
CodePudding user response:
Any reasonable behaving compiler will optimize everything away when you define debug to zero. However, there is no guarantee so a better solution is:
#ifdef debug
if (a > 0 && b > 0){
fprintf (stderr, "a(%d) >0 && b(%d)\n", a,b);
}
#endif
CodePudding user response:
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.