2011-04-04 15 views
20

necesito compartir algunas cadenas en mi programa C++. ¿Debo usar #define o const string? graciasconst string vs. #define

mystring1.h

#define str1 "str1" 
#define str2 "str2"  

O
mystring2.h

extern const string str1; 
extern const string str2; 

mystring.cpp

const string str1 = "str1"; 
const string str2 = "str2"; 
+0

El preprocesador solo debe usarse para incluir guardias, '__FILE__' y macros integradas similares, y #ifdefs para constantes específicas de la plataforma. Si bien * puede * usarlo para definir las constantes realmente utilizadas por su código, es una mala idea por varias razones que se han señalado en las respuestas a continuación. –

Respuesta

19

Prefiere la segunda opción. Si usa la primera opción (preprocesador), está limitando su flexibilidad con el objeto.

Considere lo siguiente ... Usted no será capaz de comparar cadenas de esta manera:

if (str1 == "some string") 
{ 
    // ... 
} 
+0

Pero se puede hacer: si (std :: string (cadena1) == "un trozo de cuerda") { // ...} – traal

+0

Tal vez una cuestión distinta, pero ¿qué pasa con '' string' const vs constexpr char [] '(ya que constexpr no se puede usar en cadenas)? – Zitrax

2

Si usted no tiene que utilizar el preprocesador Don' t!

Si estas cadenas son necesarias en un editor de recursos o en un manifiesto o algo así como debería hacerlo.

5

Si se trata de C++, debe usar la biblioteca estándar de C++ std::string. Es mucho más claro que una macro de preprocesador, tendrá una única ubicación en la memoria cuando esté definida, y tiene toda la funcionalidad adicional de std::string en lugar de solo comparaciones con punteros, como es el caso de las const char* implícitas que se crean con una macro de preprocesador .

+1

Estoy usando std :: string – user612308

+1

Lo siento, he interpretado mal 'string str1' como' const char [] '. Realmente deberías evitar 'usar namespace std'. –

1

También puedes, simplemente utilizar una cadena const char * para los datos constantes y no un objeto de cadena, ya que la el objeto tendrá que inicializarse al inicio del programa con los datos constantes de todos modos. Haga esto si no va a hacer mucho con cadenas, sino simplemente mostrarlas o imprimirlas tal como están.

Así:

extern const char * str1; 

y

const char * str1 = "str1"; 
0

Yo sugeriría el uso de funciones.

extern const std::string& str1(); 
extern const std::string& str2(); 

Esto le da más flexibilidad en la forma de obtener esas cadenas en el archivo .cpp.

0

Considere también la cuestión de la construcción estática y la orden de destrucción no POD, como se describe en Google C++ style guide.

Una alternativa es utilizar:

const char str1[] = "str1"; 
const char str1[] = "str2"; 
2

Para aprovechar OO de C++, yo diría que el uso struct/clase.

cabecera:

struct Constants { 
    static const string s1; 
    static const string s2; 
}; 

CPP:

const string Constants::s1 = "blah1"; 
const string Constants::s2 = "blah2"; 

Para hacer referencia a:

cout << Constants::s1 << endl; 
0

Si se trata de C++ en lugar de C, que realmente debería usar alguna variable en lugar de un preprocesador macro. El primero es más claro que el segundo. Además, si se utiliza C++ 17, puede utilizar variables de línea:

inline const std::string str = "foobar"; 

o

// constexpr is implicitly inline 
constexpr const char *str = "foobar"; 

Esto también es más claro que el uso de extern y se puede utilizar en APIs sólo de encabezado también.