#include <cstdio>
//ASM and C way:
struct user { //block of memory
const char* username;
};
void c_name_printer(user* self) {printf("%s\n", self->username);} //function
//basically the same as:
//C++ way:
struct name_printer_object { //function object
const char* username;
void operator()() {printf("%s\n", username);} //but is callable like a function
};
int main() {
user smith = {"Smith"};
c_name_printer(&smith); //function
name_printer_object steve_name = {"Steve"}; //function object
steve_name(); //but callable like a function
}
/*The difference is I can pass `steve_name` to another function that expects a "void func()" function,
and it can call it properly, and will still print "Steve".
The C way I'd _also_ have to pass a pointer to "smith" and the other function would have to provide that
pointer to the c_name_printer pointer. That's just complicated.*/
I2luY2x1ZGUgPGNzdGRpbz4KCiAgIC8vQVNNIGFuZCBDIHdheToKICAgc3RydWN0IHVzZXIgeyAvL2Jsb2NrIG9mIG1lbW9yeQogICAgICAgIGNvbnN0IGNoYXIqIHVzZXJuYW1lOwogICAgfTsKICAgIHZvaWQgY19uYW1lX3ByaW50ZXIodXNlciogc2VsZikge3ByaW50ZigiJXNcbiIsIHNlbGYtPnVzZXJuYW1lKTt9IC8vZnVuY3Rpb24KCiAgICAvL2Jhc2ljYWxseSB0aGUgc2FtZSBhczoKICAgIC8vQysrIHdheToKICAgIHN0cnVjdCBuYW1lX3ByaW50ZXJfb2JqZWN0IHsgLy9mdW5jdGlvbiBvYmplY3QKICAgICAgICBjb25zdCBjaGFyKiB1c2VybmFtZTsKICAgICAgICB2b2lkIG9wZXJhdG9yKCkoKSB7cHJpbnRmKCIlc1xuIiwgdXNlcm5hbWUpO30gLy9idXQgaXMgY2FsbGFibGUgbGlrZSBhIGZ1bmN0aW9uCiAgICB9OwoKaW50IG1haW4oKSB7CiAgICB1c2VyIHNtaXRoID0geyJTbWl0aCJ9OwogICAgY19uYW1lX3ByaW50ZXIoJnNtaXRoKTsgLy9mdW5jdGlvbgogICAgCiAgICBuYW1lX3ByaW50ZXJfb2JqZWN0IHN0ZXZlX25hbWUgPSB7IlN0ZXZlIn07IC8vZnVuY3Rpb24gb2JqZWN0CiAgICBzdGV2ZV9uYW1lKCk7IC8vYnV0IGNhbGxhYmxlIGxpa2UgYSBmdW5jdGlvbgp9CgovKlRoZSBkaWZmZXJlbmNlIGlzIEkgY2FuIHBhc3MgYHN0ZXZlX25hbWVgIHRvIGFub3RoZXIgZnVuY3Rpb24gdGhhdCBleHBlY3RzIGEgInZvaWQgZnVuYygpIiBmdW5jdGlvbiwKIGFuZCBpdCBjYW4gY2FsbCBpdCBwcm9wZXJseSwgYW5kIHdpbGwgc3RpbGwgcHJpbnQgIlN0ZXZlIi4gIApUaGUgQyB3YXkgSSdkIF9hbHNvXyBoYXZlIHRvIHBhc3MgYSBwb2ludGVyIHRvICJzbWl0aCIgYW5kIHRoZSBvdGhlciBmdW5jdGlvbiB3b3VsZCBoYXZlIHRvIHByb3ZpZGUgdGhhdApwb2ludGVyIHRvIHRoZSBjX25hbWVfcHJpbnRlciBwb2ludGVyLiAgVGhhdCdzIGp1c3QgY29tcGxpY2F0ZWQuKi8=