Allanqunzi
Allanqunzi

Reputation: 3260

global declarations/initializations using static, const, constexpr

In C++ or C++11, for the following declarations//initializations,

// global scope
const int a = 1; // line 1
static const int b = 2; // line 2
constexpr int c = 3;  // line 3
static constexpr int d = 4; // line 4
constexpr int e = a + b + c*d; // line 5
static constexpr int f = a - b - c*d; // line 6

This question says at file scope there is no difference between line 1 and 2 in C++. How about line 3 and 4?

Are there differences between line 4 and 5?

Are there differences between line 5 and 6?

Upvotes: 5

Views: 3747

Answers (2)

Kryssel Tillada
Kryssel Tillada

Reputation: 180

static variables exist for the lifetime of the program static is useful for functions like this:

void func (int i) {
    int var = i;
}

when a function is finish executing its code its objects destroys automatically to prevent this you can use static

void func (int i) {
   static int var = i;
}

this mean that when a function finish executing its code the object defined as static will remain until the program ends

const applies for variables, and prevents them from being modified in your code. and constexpr are used for constant expressions this two is read-only it means that once you initialize a value it cannot be modified

the difference of this two is:

static constexpr int d = 4; // line 4
constexpr int e = a + b + c*d; 

in static constexpr int d = 4 is we define a variable named d that is a static constant expression integer and have a value of 4 and cannot be modified and remain until the program ends

and in constexpr int e = a + b + c*d; is we define a variable name e that is constant expression integer that have a value depends on what the result in those operations and cannot be modified

Upvotes: 0

Baptiste Wicht
Baptiste Wicht

Reputation: 7663

No, there should not be any difference (aside from their values of course) because constexpr and const implies internal linkage:

[C++11: 3.5/3]: A name having namespace scope (3.3.6) has internal linkage if it is the name of

  • a variable, function or function template that is explicitly declared static; or,
  • a variable that is explicitly declared const or constexpr and neither explicitly declared extern nor previously declared to have external linkage; or
  • a data member of an anonymous union.

Upvotes: 7

Related Questions