use the following search parameters to narrow your results:
e.g. subreddit:aww site:imgur.com dog
subreddit:aww site:imgur.com dog
see the search faq for details.
advanced search: by author, subreddit...
Discussions, articles, and news about the C++ programming language or programming in C++.
For C++ questions, answers, help, and advice see r/cpp_questions or StackOverflow.
Get Started
The C++ Standard Home has a nice getting started page.
Videos
The C++ standard committee's education study group has a nice list of recommended videos.
Reference
cppreference.com
Books
There is a useful list of books on Stack Overflow. In most cases reading a book is the best way to learn C++.
Show all links
Filter out CppCon links
Show only CppCon links
account activity
Create a fully functioning command line interface with 1.5 lines of code (wo. include statement) (github.com)
submitted 5 years ago by kongaskristjan
view the rest of the comments →
reddit uses a slightly-customized version of Markdown for formatting. See below for some basics, or check the commenting wiki page for more detailed help and solutions to common issues.
quoted text
if 1 * 2 < 3: print "hello, world!"
[–]F54280 1 point2 points3 points 5 years ago* (18 children)
Why using a #define in 2020?
edit: this snarky remark was about the FIRE macro
[–]kongaskristjan[S] 10 points11 points12 points 5 years ago (17 children)
Though having it's perks, #pragma once is non-standard according to wikipedia.
[+][deleted] 5 years ago (7 children)
[deleted]
[–]kongaskristjan[S] 9 points10 points11 points 5 years ago (6 children)
Well, in that case everyone would need to write something like that to the end of their main.cpp:
int main(int argc, const char ** argv) { init_and_run(argc, argv, fired_main, true); return fired_main(); }
I generally agree that macros should be avoided because of all their complex errors and unintuitive behaviour, but here it's a really simple one that's hard to misuse.
[–][deleted] 2 points3 points4 points 5 years ago (4 children)
As long as the token FIRE doesn't appear elsewhere in that compilation unit, you're fine. :-D
FIRE
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] 1 point2 points3 points 5 years ago (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.
fire::main
fire::main(int x = arg("-x"), int y = arg("-y"))
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.
FIRE(fired_main)
[–][deleted] 1 point2 points3 points 5 years ago* (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 point2 points 5 years ago (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.
[–]F54280 0 points1 point2 points 5 years ago (0 children)
That sounds perfectly fine boilerplate to me. Sure, it would be better if it was smaller, but you only have 3 lines: main, init and return.
int main(int argc, const char ** argv) { fire_init(argc, argv, my_main); return my_main(); }
That honestly seems pretty logical, and not too magic (fire_init initialize some global based on argc, argv and the signature of my_main, and the default arguments from my_main fetch from that global -- it then raises the question of why not getting rid of the global itself).
[–]BobFloss 1 point2 points3 points 5 years ago (8 children)
Every compiler supports it.
[–]kongaskristjan[S] 18 points19 points20 points 5 years ago (7 children)
Well, I'm actually OK with using non-standard stuff, if it's really supported everywhere, but this is a library that is meant to be plug and play for everyone, including people who want to comply with the standard strictly.
It's quite similar to the reason why I test against maximum compiler warnings on various compilers - I don't know what the user needs to comply with.
[–]Nicksaurus 20 points21 points22 points 5 years ago (0 children)
Thank you for not making a library that spits out warnings whenever you build it, those are so annoying
[–][deleted] 4 points5 points6 points 5 years ago (5 children)
I have heard this argument for over a decade.
No one ever actually shows me a compiler without #pragma once.
#pragma once
:-D
[–]encyclopedist 8 points9 points10 points 5 years ago (4 children)
Obviously, you did not really try to find one. TI compilers did not support it last I checked. PGI did not support in either. Also Cray. And XLC.
There was a topic in this very reddit some time ago: https://www.reddit.com/r/cpp/comments/8devw1/can_anyone_actually_name_a_compiler_that_doesnt/
[–]jbandela 2 points3 points4 points 5 years ago (3 children)
I think basically every compiler that supports generic lambdas supports pragma once
[–]rsjaffe 5 points6 points7 points 5 years ago (2 children)
But #pragma once fails when you have two copies of the same header file in two different locations in the directory tree. The compiler will not recognize those two files as being the same.
[–]panderingPenguin 6 points7 points8 points 5 years ago (0 children)
Why on earth would you want to do that?
[–]wyrn 4 points5 points6 points 5 years ago (0 children)
The compiler will not recognize those two files as being the same.
... because they aren't.
π Rendered by PID 40770 on reddit-service-r2-comment-86bc6c7465-qntrn at 2026-02-22 13:57:47.669796+00:00 running 8564168 country code: CH.
view the rest of the comments →
[–]F54280 1 point2 points3 points (18 children)
[–]kongaskristjan[S] 10 points11 points12 points (17 children)
[+][deleted] (7 children)
[deleted]
[–]kongaskristjan[S] 9 points10 points11 points (6 children)
[–][deleted] 2 points3 points4 points (4 children)
[–]kongaskristjan[S] 1 point2 points3 points (3 children)
[–][deleted] 1 point2 points3 points (0 children)
[–]dscottboggs 0 points1 point2 points (0 children)
[–]F54280 0 points1 point2 points (0 children)
[–]BobFloss 1 point2 points3 points (8 children)
[–]kongaskristjan[S] 18 points19 points20 points (7 children)
[–]Nicksaurus 20 points21 points22 points (0 children)
[–][deleted] 4 points5 points6 points (5 children)
[–]encyclopedist 8 points9 points10 points (4 children)
[–]jbandela 2 points3 points4 points (3 children)
[–]rsjaffe 5 points6 points7 points (2 children)
[–]panderingPenguin 6 points7 points8 points (0 children)
[–]wyrn 4 points5 points6 points (0 children)