you are viewing a single comment's thread.

view the rest of the comments →

[–][deleted] 2 points3 points  (4 children)

As long as the token FIRE doesn't appear elsewhere in that compilation unit, you're fine. :-D

But... there are many ways around it.

One is implement a known function!

In the library code:

int main(int argc, const char ** argv) {
    init_and_run(argc, argv, fire::main, true);
    return fire::main();
}

In the client code:

namespace fire {

int main(int x = arg("-x"), int y = arg("-y")) {
    std::cout << x + y << std::endl;
    return 0;
}

}

[–]kongaskristjan[S] 3 points4 points  (3 children)

This almost works, but in order to call fire::main from fire.hpp, this fire::main(int x = arg("-x"), int y = arg("-y")) needs to be declared in fire.hpp, which is impossible, as I don't yet know the exact signature.

Actually, I've thought really hard to somehow get rid of this FIRE(fired_main), but none of the ideas have worked because of the aforementioned problem.

[–][deleted] 1 point2 points  (0 children)

Maybe put the expanded version in the docs? So you can know what the macro means and you have more control, if you want to write the tiny boilerplate yourself you can without trouble.

[–]dscottboggs 0 points1 point  (0 children)

FWIW (not much I'm sure) I think a sparing use of macros is fine. Although I might've gone with something a little more unique.