Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C-style conditional compilation in golang

Tags:

Does golang support

#define DEBUG   #ifdef DEBUG    fmt.Println("Debug message...");  #endif  

So I can build a debug version with zero runtime overhead?

like image 246
can. Avatar asked Aug 15 '16 07:08

can.


People also ask

What is conditional compilation in C?

Conditional compilation is the process of selecting which code to compile and which code to not compile similar to the #if / #else / #endif in C and C++. Any statement that is not compiled in still must be syntactically correct. Conditional compilation involves condition checks that are evaluable at compile time.

What is conditional compilation explain with example?

Conditional compilation provides a way of including or omitting selected lines of source code depending on the values of literals specified by the DEFINE directive. In this way, you can create multiple variants of the same program without the need to maintain separate source streams.

Why is conditional compilation used in C?

Conditional Compilation: Conditional Compilation directives help to compile a specific portion of the program or let us skip compilation of some specific part of the program based on some conditions.

What statements are used for conditional compilation?

The $ELSE statement is used in conjunction with the $IF statement to control conditional compilation. The $END statement is used in conjunction with the $IF statement to control conditional compilation. A $IF statement provides the means whereby selected parts of the source text are not included in the compilation.


2 Answers

Go does not have a preprocessor or a macro system. What you could do is pass in tags to go build through the -tags flag and use build constraints. To do this you would need two versions of the same source and only one would get build depending if the tag is present or not.

Look at build constraints in https://golang.org/pkg/go/build/

main_debug.go

// +build debug  package main  import (     "fmt" )  func main() {     fmt.Println("Debug build") } 

main_release.go

// +build !debug  package main  import (     "fmt" )  func main() {     fmt.Println("Release build") } 

Here go build would compile with main_release.go and go build -tags debug would compile with main_debug.go

like image 83
aebudak Avatar answered Sep 23 '22 13:09

aebudak


if you work on linux or Mac , you can try the "m4" command.This command is a macro processor which just fits this issue.

Writing a Makefile to run the m4 command before "go build" can do the same as using "go build -tags ..." and support more customization and of course, save your work.

for example:

write these within your go file(such as main.go):

define(DEBUG) ifdef(`DEBUG',     fmt.Println("Debug message...");  ) 

write these within your Makefile file:

all:*.go     mv main.go main.go.bak     m4 main.go.bak > main.go     go build     mv main.go.bak main.go 

then run "make".

Disadvantage:

  1. You can't write a go function named "define" or "ifndef" etc which will be translated into Macro by m4.
  2. If you have a lot of files you may want to improve your Makefile.
  3. You may want to study m4 which is a little difficult and complicated.
like image 45
Hahahrf Avatar answered Sep 20 '22 13:09

Hahahrf