| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| int addi(int a, int b) { | |
| return a + b; | |
| } | |
| char *adds(char *a, char *b) { | |
| char *res = malloc(strlen(a) + strlen(b) + 1); | |
| strcpy(res, a); | |
| strcat(res, b); | |
| return res; | |
| } | |
| #define add(a, b) _Generic(a, int: addi, char*: adds)(a, b) | |
| int main(void) { | |
| int a = 1, b = 2; | |
| printf("%d\n", add(a, b)); // 3 | |
| char *c = "hello ", *d = "world"; | |
| printf("%s\n", add(c, d)); // hello world | |
| return 0; | |
| } |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
jasiek
commented
Jul 26, 2015
|
I wonder if this'll work on the Arduino. |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
dataf3l
commented
Jul 26, 2015
|
works as advertised on osx. |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
Tyler-Hardin
Jul 26, 2015
@jasiek, if you can find a C11 compiler for Arduino. GCC supports the _Generic portion of C11 since 4.9, so it should work with avr-gcc-4.9 or newer.
Tyler-Hardin
commented
Jul 26, 2015
|
@jasiek, if you can find a C11 compiler for Arduino. GCC supports the _Generic portion of C11 since 4.9, so it should work with avr-gcc-4.9 or newer. |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
2mac
Jul 26, 2015
You create a memory leak by not storing a pointer to the concatenated string before printing it, since now you can't free it after you malloc'd it.
2mac
commented
Jul 26, 2015
|
You create a memory leak by not storing a pointer to the concatenated string before printing it, since now you can't free it after you |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
patrickt
Jul 26, 2015
clang provides __attribute__((overloadable)), which enables a limited version of C++-style name-mangling based polymorphism, so that you don't have to write a _Generic wrapper for each function.
patrickt
commented
Jul 26, 2015
|
|
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
lpereira
Jul 26, 2015
Here's another example I wrote the other day, that's actually useful: number parsing, regardless of its type: parse_number().
lpereira
commented
Jul 26, 2015
|
Here's another example I wrote the other day, that's actually useful: number parsing, regardless of its type: parse_number(). |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
KLuka
commented
Jul 26, 2015
|
@2mac memory is freed at line 25 OT: thanks for the interesting stuff... |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
daurnimator
Jul 26, 2015
Without C11:
#define NARG_(_15, _14, _13, _12, _11, _10, _9, _8, _7, _6, _5, _4, _3, _2, _1, N, ...) N
#define NARG(...) NARG_(__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
#define PASTE(a, b) a ## b
#define XPASTE(a, b) PASTE(a, b)
int foo(int a, int b) {
return 1;
}
#define foo2(a,b) foo((a), (b))
#define foo1(x) foo2(x,0)
#define foo(...) XPASTE(foo, NARG(__VA_ARGS__))(__VA_ARGS__)
daurnimator
commented
Jul 26, 2015
|
Without C11:
|
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
theonewolf
Jul 26, 2015
Is there a way to do stricter type checking on more than one argument? As I read this, it is only checking the type of the first argument?
theonewolf
commented
Jul 26, 2015
|
Is there a way to do stricter type checking on more than one argument? As I read this, it is only checking the type of the first argument? |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
dubslow
commented
Jul 26, 2015
|
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
Benabik
Jul 26, 2015
@jasiek: The Arduino IDE uses C++, so function overloading works just fine. (So do templates, but you have to define them in a .h file rather than the default extension-less file.)
Benabik
commented
Jul 26, 2015
|
@jasiek: The Arduino IDE uses C++, so function overloading works just fine. (So do templates, but you have to define them in a .h file rather than the default extension-less file.) |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
danetrata
commented
Jul 26, 2015
|
@KLuka |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
dbevzenko
commented
Jul 26, 2015
|
Still not supported by Intel C compiler though. |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
jaytaylor
commented
Jul 26, 2015
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
Fusion
Jul 26, 2015
@dubslow Yes, main leaks memory. I realize now that github has its own "grammar police" since that was not the point of this gist.
Fusion
commented
Jul 26, 2015
|
@dubslow Yes, main leaks memory. I realize now that github has its own "grammar police" since that was not the point of this gist. |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
polkovnikov-ph
Jul 26, 2015
@Fusion I'd say it's not github, but C community, as memory leaks is something to avoid even in examples that are this simple.
polkovnikov-ph
commented
Jul 26, 2015
|
@Fusion I'd say it's not github, but C community, as memory leaks is something to avoid even in examples that are this simple. |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
spekode
commented
Jul 26, 2015
|
DAE notice the memory leak??????????????? |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
tkellogg
commented
Jul 27, 2015
|
OMG did you guys see the memory leak?!! |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
Ygrex
commented
Aug 19, 2015
|
'a' gets evaluated twice |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
lrocha3
Feb 16, 2017
There is a memory leak. You allocate with malloc but you never free the allocated memory. You should fix that.
lrocha3
commented
Feb 16, 2017
|
There is a memory leak. You allocate with malloc but you never free the allocated memory. You should fix that. |
I wonder if this'll work on the Arduino.