Reputation: 563
static const char* const test_script = "test_script";
When and why would you use a statement such as the one above? Does it have any benefits?
Why use a char*
instead of a constant character?
A "constant Character pointer" (const char*
) is a constant already and cannot be changed; Then why use the word static
in the front of it? What good does it do?
Upvotes: 3
Views: 1757
Reputation: 171127
A const char *p
is not a constant pointer. It's a modifiable pointer to a const char
, that is, to a constant character. You can make the pointer point to something else, but you cannot change the character(s) to which it points. In other words, p = x
is allowed, but *p = y
is not.
A char * const
is the opposite: a constant pointer to a mutable character. *p = y
is allowed, p = x
is not.
A const char * const
is both: a constant pointer to a constant character.
Regarding static
: this gives the declared variable internal linkage (cannot be accessed by name from outside the source file). Since you're asking about both C and C++, note that this is where they differ.
In C++, a variable declared const
and not explicitly declared extern
has internal linkage by default. Since the pointer in question is const
(I'm talking about the second const
), the static
is superfluous in C++ and doesn't do anything.
That's not the case in C, where const
variables cannot be used as constant expressions and do not have internal linkage by default. So in C, the static
is necessary to give test_script
internal linkage.
The above discussion of static
assumes the declaration is at file scope (C) or namespace scope (C++). If it's inside a function, the meaning of static
changes. Without static
, it would a normal local variable in the function—each invocation would have its own copy. With static
, it receives static storage duration and thus persists between function calls—all invocations share that one copy. Since you're asking about both C and C++, I am not going to discuss class scope.
Finally, you asked "why pointer instead of characters." This way, the pointer points to the actual string literal (probably somewhere in the read-only part of the process's memory). One reason to do that would be if you even need to pass test_script
somewhere where a const char * const *
(a pointer to a constant pointer to constant character(s)) is expected. Also, if the same string literal appears multiple times in source code, it can be shared.
An alternative would be to declare an array:
const char test_script[] = "test_script";
This would copy the string literal into test_script
, guaranteeing that it has its own copy of the data. Then you can learn the length at compile-time from sizeof test_script
(which includes the terminating NUL
). It will also consume slightly less memory (no need for the pointer) if it's the only occurence of that string literal. However, as it will have its own copy of the data, it cannot share the storage of the string literal (if that is used elsewhere in the code as well).
Upvotes: 7