Can I mix extern and const, as extern const? If yes, does the const qualifier impose it's reign only within the scope it's declared in or should it exactly match the declaration of the translational unit it's declared in? I.e. can I declare say extern const int i;
even when the actual i is not a const and vice versa?
相关问题
- Sorting 3 numbers without branching [closed]
- Multiple sockets for clients to connect to
- How to compile C++ code in GDB?
- Why does const allow implicit conversion of refere
- thread_local variables initialization
Yes, you can use them together.
If you declare "extern const int i", then i is const over its full scope. It is impossible to redefine it as non-const. Of course you can bypass the const flag by casting it away (using const_cast).
You can use them together. But you need to be consistent on your use of const because when C++ does name decoration, const is included in the type information that is used to decorate the symbol names. so
extern const int i
will refer to a different variable thanextern int i
Unless you use extern "C" {}. C name decoration doesn't pay attention to const.
C++17
inline
variablesIf you think you want an
extern const
, then it is more likely that you would actually want to use C++17 inline variables.This awesome C++17 feature allow us to:
constexpr
: How to declare constexpr extern?main.cpp
notmain.hpp
notmain.cpp
Compile and run:
GitHub upstream.
The C++ standard guarantees that the addresses will be the same. C++17 N4659 standard draft 10.1.6 "The inline specifier":
cppreference https://en.cppreference.com/w/cpp/language/inline explains that if
static
is not given, then it has external linkage.Pre-C++ 17:
extern const
extern const
does work as in the example below, but the downsides overinline
are:constexpr
with this technique, onlyinline
allows that: How to declare constexpr extern?main.cpp
notmain.cpp
notmain.hpp
GitHub upstream.
Any way to fully inline it?
TODO: is there any way to fully inline the variable, without using any memory at all?
Much like what the preprocessor does.
This would require somehow:
Related:
Tested in Ubuntu 18.10, GCC 8.2.0.
You can use them together and you can do all sorts of things which ignore the const keyword, because that's all it is; a keyword. It tells the compiler that you won't be changing a variable which in turn allows the compiler to do some useful optomisations and stops you from changing things you didn't mean to.
Possibility.com has a decent article with some more background.
The usual pattern is:
extern const int a_global_var;
#include "file.h"
const int a_global_var = /* some const expression */;
Edit: Incorporated legends2k's comment. Thanks.