C variadic macro equivalent in Golang?

161 views
Skip to first unread message

minf...@arcor.de

unread,
Nov 30, 2019, 3:08:41 PM11/30/19
to golang-nuts
C allows comma-separated argument lists via variadic macros. Whereas AFAIK golang allows only variadic arguments of the same type.
(Please excuse if I am wrong, I am considering myself a golang newbie)

C demo program that prints:   -- -- 1 and 1 1 and 1

// ###### C variadic macro test

#include <stdio.h>

#define PR(...) if(df){printf(__VA_ARGS__);\
                if(ef)fprintf(stderr,__VA_ARGS__);}

// Flags
int df=1, ef=1;

int main(void) {
  PR("-- ");
  PR("%d and %d ",df,ef);
}

// ###### End

How would one implement an equivalent PR(...) "function" in Go ???

Robert Engels

unread,
Nov 30, 2019, 4:00:52 PM11/30/19
to minf...@arcor.de, golang-nuts
Make the type interface{} and you can pass anything and use reflect

On Nov 30, 2019, at 2:08 PM, minf...@arcor.de wrote:


--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/e36eb032-ffbc-4b26-8c41-f76aa6dcdd00%40googlegroups.com.

minf...@arcor.de

unread,
Nov 30, 2019, 7:20:28 PM11/30/19
to golang-nuts
Thanks, but then you would have to define the interface beforehand for any argument type. And there are a lot:
format strings, strings, characters, integers of different size, floating-pont numbers, file-ids

Meanwhile I found this discussion:
which hints that comma-separated variadic arguments might come with Go 2.x in some unknown future.


Am Samstag, 30. November 2019 22:00:52 UTC+1 schrieb Robert Engels:
Make the type interface{} and you can pass anything and use reflect

On Nov 30, 2019, at 2:08 PM, minf...@arcor.de wrote:


C allows comma-separated argument lists via variadic macros. Whereas AFAIK golang allows only variadic arguments of the same type.
(Please excuse if I am wrong, I am considering myself a golang newbie)

C demo program that prints:   -- -- 1 and 1 1 and 1

// ###### C variadic macro test

#include <stdio.h>

#define PR(...) if(df){printf(__VA_ARGS__);\
                if(ef)fprintf(stderr,__VA_ARGS__);}

// Flags
int df=1, ef=1;

int main(void) {
  PR("-- ");
  PR("%d and %d ",df,ef);
}

// ###### End

How would one implement an equivalent PR(...) "function" in Go ???

--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golan...@googlegroups.com.

Michael Jones

unread,
Nov 30, 2019, 8:21:18 PM11/30/19
to minf...@arcor.de, golang-nuts
You might refer to... 


...to better appreciate Robert's advice. As he suggested, a variadic Go function accepting a slice of the special, magic "empty interface" type ("interface{}") can indeed do anything. The downside is that you have to do the anything yourself...validating the types of the unknown and mysterious arguments at run time rather than the compiler validating it for you at compile time.

For moral support, fmt.Printf is a popular example of this API structure.

To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/181a2df8-f5a2-4a35-9d34-6645d2b1356a%40googlegroups.com.


--
Michael T. Jones
michae...@gmail.com

Bakul Shah

unread,
Nov 30, 2019, 9:00:03 PM11/30/19
to minf...@arcor.de, golang-nuts
func PR(f string, a ...interface{}) {
if d { return }
fmt.Fprintf(os.Stderr, f, a...)
}

Add appropriate imports. 


--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts...@googlegroups.com.

minf...@arcor.de

unread,
Dec 1, 2019, 4:49:59 AM12/1/19
to golang-nuts
That did it:

// ------- variad.go -- variadic function test

package main
import("fmt";"os")

// flags
var df,ef int = 1,1

// variadic function thru empty interface

func PR(f string, a ...interface{}) {
    if df!=0 { fmt.Printf(f, a...)
       if ef!=0 { fmt.Fprintf(os.Stderr,f, a...) } }
}

func main() { // should print:  -- -- 1 a 1 1 a 1
   PR("-- ")
   PR("%d a %d ",df,ef)
}

// ------- End

Thanks a lot to everybody !!  


Am Sonntag, 1. Dezember 2019 03:00:03 UTC+1 schrieb Bakul Shah:
func PR(f string, a ...interface{}) {
if d { return }
fmt.Fprintf(os.Stderr, f, a...)
}

Add appropriate imports. 

On Nov 30, 2019, at 12:08 PM, minf...@arcor.de wrote:

C allows comma-separated argument lists via variadic macros. Whereas AFAIK golang allows only variadic arguments of the same type.
(Please excuse if I am wrong, I am considering myself a golang newbie)

C demo program that prints:   -- -- 1 and 1 1 and 1

// ###### C variadic macro test

#include <stdio.h>

#define PR(...) if(df){printf(__VA_ARGS__);\
                if(ef)fprintf(stderr,__VA_ARGS__);}

// Flags
int df=1, ef=1;

int main(void) {
  PR("-- ");
  PR("%d and %d ",df,ef);
}

// ###### End

How would one implement an equivalent PR(...) "function" in Go ???


--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golan...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages