In C++, if I want to define some **non-local const string** which can be used in different classes, functions, files, the approaches that I know are:

1. use define directives, e.g.

```
#define STR_VALUE "some_string_value"

```
2. const class member variable, e.g.

```
class Demo {  
public:  
  static const std::string ConstStrVal;  
};  
// then in cpp  
std::string Demo::ConstStrVal = "some_string_value";  

```
3. const class member function, e.g.

```
class Demo{  
public:  
  static const std::string GetValue(){return "some_string_value";}  
};  

```

Now what I am not clear is, if we use the 2nd approach, is the variable ConstStrVal always initialized to "some\_string\_value" before it is actually used by any code in any case? Im concerned about this because of the ["static initialization order fiasco"](http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14). If this issue is valid, why is everybody using the 2nd approach? 

Which is the best approach, 2 or 3? I know that #define directives have no respect of scope, most people don't recommend it.

Thanks!