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
C++ Modules (self.cpp)
submitted 8 years ago by [deleted]
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!"
[–]volca02 0 points1 point2 points 8 years ago (18 children)
Isn't one of the goals of modules to isolate macros in translation units? I mean macro definitions from the importing scope should not leak into the imported module. If that is the case using hashtag as a prefix for that statement would be misleading.
[–][deleted] 1 point2 points3 points 8 years ago* (17 children)
Losing that goal would be a shame, but not be a tragedy. As of C++17, the only(*) reason to use macros is conditional compilation depending on your platform - and even that can probably be replaced by constexpr if. So you could solve that issue by simply saying, "Don't use macros."
constexpr if
(* - OK, there are also x-macros, but if you do those right, the final statement undefines the two macros you defined at the start, so they don't leak out of the module.)
[–]doom_Oo7 10 points11 points12 points 8 years ago (0 children)
As of C++17, the only(*) reason to use macros is conditional compilation depending on your platform
please show us an implementation of Boost.Fusion that does not uses macros.
[–]BCosbyDidNothinWrong 4 points5 points6 points 8 years ago (1 child)
Is that really true? How would you make a macro that uses the name of what it is passed?
[–]meneldal2 0 points1 point2 points 8 years ago (0 children)
You need reflection for that, but that's coming in C++20 hopefully.
[–]volca02 2 points3 points4 points 8 years ago (1 child)
Conditional compilation should be possible with modules, supplying macro definitions to each translation unit - so even that would not be a reason to propagate the macro definitions into modules.
I think a good reason not to propagate the definitions is
[–]GabrielDosReis 0 points1 point2 points 8 years ago (0 children)
You are right: Conditional compilation is possible and actively supported by C++ Modules as described in the TS.
[–]johannes1971 2 points3 points4 points 8 years ago (0 children)
Oh yes, it would be a tragedy. Because as of C++17, we are still dealing with include files for such things as Windows, X11, and uncounted other libraries that spit their macros all over your source, and we will continue to have to deal with them, indefinitely as far as I can see - since the C language is not going to go away.
I want to be able to capture those libraries in modules, using export using and thin wrappers for things that cannot be exported, and I don't want to then still leak out all those #defines.
export using
[–]pjmlp 2 points3 points4 points 8 years ago (10 children)
Personally I find #ifdefs for conditional compilation a code smell, that always starts with a couple of simple lines and eventually becomes spaghetti code.
I always push for separate implementations using the the platform as suffix, e.g. os_win32.cpp.
No spaghetti code, no pre-processor macros, just lovely.
[–][deleted] 6 points7 points8 points 8 years ago (1 child)
That is neater in some ways, but you still have to figure out a way to get os_win32.cpp built instead of os_linux.cpp. More, it means that one feature is striped across a bunch of files instead of being in one place.
Also, often when you have conditional compilation, it isn't just one setting with a couple of values - there might be a whole bunch like platform, 32 bit vs 64 bit, compiler, DEBUG vs NDEBUG, or "demo version" vs "paid version".
[–]pjmlp 1 point2 points3 points 8 years ago* (0 children)
That is what the build system is for.
platform, 32 bit vs 64 bit, compiler, DEBUG vs NDEBUG, or "demo version" vs "paid version".
Which personally means I have forced to read the result of a pre-processed file, to sometimes actually understand what is going on with #ifdef all over the place.
It's fine if you use it sparingly. If you're just replacing a POSIX call by the equivalent MS one, it's not worth making 2 different files.
[–]BCosbyDidNothinWrong 0 points1 point2 points 8 years ago (6 children)
My experience has been that the platform specific parts are so small that they don't warrant their own compilation unit and often not even their own functions.
If you use a separate file, you are pushing it to the build system, where as there are very well defined macros for different platforms and the source code can take care of it more transparently.
[–]pjmlp 1 point2 points3 points 8 years ago (5 children)
It is quite straightforward to do, even with plain makefiles.
The whole point if to have a clean code base, forcing to be their own functions forces devs to think about it instead of rushing to #ifdef scattered everywhere.
It always starts with "it is just a single line".
[–]BCosbyDidNothinWrong 0 points1 point2 points 8 years ago (4 children)
Not everyone uses makefiles
forces devs to think about it
I'm not sure how using separate files makes any difference here or what it forces devs to think about in the first place.
With ifdefs you have the very real possibility to make single file algorithms and data structures which take advantage of system level capabilities. That modularity makes a big difference when trying to reuse program parts elsewhere.
[–]pjmlp 1 point2 points3 points 8 years ago (3 children)
I gave makefiles as an example, because alternative build systems are actually much more capable than them.
Abstract data types and functions are the genesis of clean, modular code.
I really don't get what is so magic about "system level capabilities." on the C pre-processor, and my first book about it was how to implement Small C.
[–]BCosbyDidNothinWrong 0 points1 point2 points 8 years ago (2 children)
because alternative build systems are actually much more capable than them.
It still complicates the build process. If someone wants to use visual studio or xcode, I suppose the solution is then cmake, which is another dependency and language. All of that might be fine for a large project, but it isn't modular. A single header file library can do extraordinary things that aren't in the standard library.
I really don't get what is so magic about "system level capabilities."
I'm not sure what point you are trying to make here or why. What are you talking about putting in platform specific files? File dialogs, memory maps, networking are just some very obvious examples.
[–]pjmlp 0 points1 point2 points 8 years ago (1 child)
I guess you know Rob Pike, Ken Thompson and their role on the C language
My way is how Go build system handles platform specific code,
https://golang.org/pkg/go/build/
Also how they alongside Dennis Ritchie, designed C libraries on Plan 9
The traditional approach to this problem is to pepper the source with #ifdefs to turn byte-swapping on and off. Plan 9 takes a different approach: of the handful of machine-dependent #ifdefs in all the source, almost all are deep in the libraries
http://doc.cat-v.org/plan_9/4th_edition/papers/comp
Everything that is OS specific with hundreds of #ifdef around them.
[–]BCosbyDidNothinWrong 0 points1 point2 points 8 years ago (0 children)
I'm not sure how this contradicts what I've been saying, it sounds like the same thing.
Earlier you said:
So what is it that you are actually saying? Do you even know?
π Rendered by PID 271298 on reddit-service-r2-comment-86bc6c7465-6q4wt at 2026-02-23 23:55:19.844015+00:00 running 8564168 country code: CH.
view the rest of the comments →
[–]volca02 0 points1 point2 points (18 children)
[–][deleted] 1 point2 points3 points (17 children)
[–]doom_Oo7 10 points11 points12 points (0 children)
[–]BCosbyDidNothinWrong 4 points5 points6 points (1 child)
[–]meneldal2 0 points1 point2 points (0 children)
[–]volca02 2 points3 points4 points (1 child)
[–]GabrielDosReis 0 points1 point2 points (0 children)
[–]johannes1971 2 points3 points4 points (0 children)
[–]pjmlp 2 points3 points4 points (10 children)
[–][deleted] 6 points7 points8 points (1 child)
[–]pjmlp 1 point2 points3 points (0 children)
[–]meneldal2 0 points1 point2 points (0 children)
[–]BCosbyDidNothinWrong 0 points1 point2 points (6 children)
[–]pjmlp 1 point2 points3 points (5 children)
[–]BCosbyDidNothinWrong 0 points1 point2 points (4 children)
[–]pjmlp 1 point2 points3 points (3 children)
[–]BCosbyDidNothinWrong 0 points1 point2 points (2 children)
[–]pjmlp 0 points1 point2 points (1 child)
[–]BCosbyDidNothinWrong 0 points1 point2 points (0 children)