clickMe
clickMe

Reputation: 1045

Meaning of "reserved for the implementation"

Reading the anwser from What are the rules about using an underscore in a c identifier I stumbled across the follwing quotation:

From the 2003 C++ Standard:

17.4.3.2.1 Global names [lib.global.names]

Certain sets of names and function signatures are always reserved to the implementation:

  • Each name that contains a double underscore (_ _) or begins with an underscore followed by an uppercase letter (2.11) is reserved to the implementation for any use.
  • Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.165

165) Such names are also reserved in namespace ::std (17.4.3.1).

What exactly is meant with reserved for the implementation?

Upvotes: 6

Views: 1218

Answers (3)

sjsam
sjsam

Reputation: 21965

Implementation here means the combination of compiler(say gcc, msvc and so on), the standard library (says what features are included in the language), Operating System(Windows, Mac etc) and hardware(Intel,ARM and so on).

Depending upon the implementation, certain values are defined which the compiler uses to produce the object code that is specific to the implementation. For example

__TARGET_ARCH_ARM is defined by RealView #Matches first case
_M_ARM is defined by Visual Studio #Matches second case

to identify the CPU manufacturer.

In short these clauses are meant to discourage you from using macros of mentioned format.

In fact, n3797->17.6.5.3 Restrictions on macro definitions says, if you wish to define macros of the aforementioned formats they are :

suitable for use in #if preprocessing directives, unless explicitly stated otherwise.

Example :

#ifndef _M_ARM
#define _M_ARM // Say you're compiling for another platform
#endif

Note

Macros, reserved for implementation, are not restricted to the format mentioned in question. For instance __arm__ is defined by gcc to identify the manufacturer.

Upvotes: 6

Kerrek SB
Kerrek SB

Reputation: 477160

The "implementation" refers to the "implementation of the C++ language". It consists of everything needed to execute a C++ program: A compiler, a standard library, hardware on which to execute, an operating system, a visualization system, input, etc.

The restriction in question means that your compiler may predefine names of the reserved form without telling you, or your standard library implementation may do so. For example, your standard library may define a macro __Foo, so if you tried to use __Foo as an identifier in your source code, you'd actually end up with the macro replacement.

The purpose of reserved names is to give your compiler and standard library freedom to express functionality in plain C++ without worrying about introducing name clashes with user code.

For a vivid example of how this is used in practice, just look at any header file of your standard library implementation.

Some reserved names have actually been made into well-defined, publicly available facilities: __FILE__, __cplusplus, __VA_ARGS__, to name a few. The C language (which has the same rules for reserved identifies) has been using reserved names exclusively to introduce new keywords (e.g. _Bool).

Upvotes: 7

SergeyA
SergeyA

Reputation: 62583

Means exactly this. It means, that you are only allowed to create such names if you are providing a compiler or standard library implementation.

Upvotes: 7

Related Questions