[lldb-dev] [RFC] Adding a clang-style LLVM.h (or, "Are you tired of typing 'llvm::' everywhere ?")
Pavel Labath via lldb-dev
lldb-dev at lists.llvm.org
Thu Apr 18 07:32:35 PDT 2019
Thanks for the replies. I was hoping to get more positive feedback for
this, so given the current mixed-feelings replies, I think I'll just
give up on this idea, unless a more vocal supporter appears (probably
not the best idea to send this out just before the easter holidays).
In the mean time, here are my thoughts on what was said.
On 18/04/2019 01:54, Adrian McCarthy wrote:
> I don't have a strong opinion, but I lean against the idea for two reasons:
>
> 1. The `llvm::` prefixes don't really hinder readability for me.
> They're like `std::` prefixes on all the C++ standard library types,
> which I'm perfectly happy to type and read--moreso than using
> declarations. Sure, anybody who's been here a while knows which classes
> come from LLVM, but new folks might build that knowledge by seeing the
> prefixes.
Yeah, I was wondering why I'm bothered by typing "llvm::" and not by
"std::". I concluded that this is down to two things:
1. we don't use that many things from the std:: namespace actually.
Pretty much everything except std::string and std::vector is discouraged
because llvm has better alternatives
2. llvm names are longer. This is not just due to to "llvm" prefix,
which is just one char, but also the class names themselves tend to be
longer. std::vector vs llvm::SmallVector, std::map vs. llvm::DenseMap,
std::string vs. llvm::StringRef, etc.
This effect gets multiplied once you start to combine things. For
instance if you have a function returning Expected<ArrayRef<T>> (which
is not an unreasonable thing to do), then by the time you spell out the
full type, more than half of your usable horizontal space is gone.
Because of this, I've found myself using "auto" or relying on ADL more
and more often, which I don't consider very ideal either.
I don't think using "auto" is always a good choice because it hides
interesting details. E.g. an Optional<T> can look a lot like
Expected<T>, but there are differences in how they are supposed used
which should not be overlooked (I wish I was able to type
"Expected<auto>" :P). And ADL is sometimes just too magical...
>
> 2. I'm not a fan of forward declaring types provided by other parts of
> the code, as it requires intimate knowledge of implementation details.
> In practice this may not matter much for the types we're considering.
> If it grew more widespread, however, I'd be more concerned. (Somewhere
> I've written a long explanation of this opinion. I'll go search for it
> if anyone cares. The Google style guide discourages forward
> declarations, but the rationale given there isn't as persuasive.)
Yeah, I agree the forward declarations are not ideal (and the clang file
did raise my eyebrows when I first saw it), but after a while I started
to like it.
FWIW, I wouldn't be opposed to just #including the relevant files
instead of forward-declaring stuff, but I think doing it the same way is
better for consistency.
Out of interest, I took a look at what lld is doing. I've found that
while it doesn't have a LLVM.h equivalent, it is a heavy user of "using
namespace llvm" (about 2 out of 3 cpp files have it). This approach
wouldn't work that well for us because of naming conflicts ("Module"),
and I would consider it inferior for the same reason that "using
namespace std" is discouraged -- it just brings in too much stuff into
your scope.
regards,
pl
More information about the lldb-dev
mailing list