Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

static string constants in class vs namespace for constants [c++]

Tags:

I want to declare string constants that will be used across various classes in the project. I am considering two alternatives

Option 1:

#header file  class constants{     static const string const1; };  #cpp file  const string constants::const1="blah"; 

Option 2:

#header file  namespace constants{     static const string const1="blah"; }; 

Just wondering what would be a better implementation.

Already looked at

Where to store Class Specific named constants in C++

Where to put constant strings in C++: static class members or anonymous namespaces


UPDATE:

Option 3:

Based on the suggestions from "potatoswatter" and "sellibitze" i currently have the following implementation?

#header file namespace constants{     extern const string& const1(); //WORKS WITHOUT THE EXTERN  ***WHY*** };  #cpp file namespace constants{    const string& const1(){static string* str = new string ("blah"); return *str;} } 

I'm including the header file where i need to use the constants. Are there any major cons of this implementation?

like image 257
Asif Mohammed Avatar asked Sep 08 '10 16:09

Asif Mohammed


People also ask

Should a constants class be static?

Yes the class should be static .

Can you declare string constants in C?

C string constants can be declared using either pointer syntax or array syntax: // Option 1: using pointer syntax. const char *ptr = "Lorem ipsum"; // Option 2: using array syntax.

What are constants in string?

A string constant is an arbitrary sequence of characters that are enclosed in single quotation marks (' '). For example, 'This is a string'. You can embed single quotation marks in strings by typing two adjacent single quotation marks.


2 Answers

Update 2 years later:

Every global accessible by more than one source file should be wrapped in an inline function so the linker shares the object between the files, and the program initializes it properly.

inline std::string const &const1() {     static std::string ret = "hello, world!";     return ret; } 

The inline function is implicitly extern and may be wrapped in a named namespace or a class, if you like. (But don't use a class just to hold static members, as namespaces are better for that. And don't use an anonymous namespace as that would defeat the linker, and each source would see a different std::string object.)

like image 195
Potatoswatter Avatar answered Sep 20 '22 07:09

Potatoswatter


All answers that resort to std::string run the risk of dynamically allocating memory for a string literal which is going to remain constant throughout the lifetime of the program (and the binary), so they should be avoided.

sellibitze's answer comes close but it has the problem of declaring it once and then defining it elsewhere, which I don't find elegant and is more work. The best way would be

namespace constants {     const char * const blah = "blah!"     const char * const yada = "yada yada!" } 

This is solution is discussed further here.

like image 37
legends2k Avatar answered Sep 19 '22 07:09

legends2k