¿Cómo declaras constantes de cadena en C?

Sé que es bastante idiomático, o al menos un buen estilo, en C para declarar constantes numéricas como enum s en lugar de #define definirlas.

 /* bad style */ #define MAXLINE 1024 /* good/better style */ enum { MAX_LINE = 1024 }; 

¿Existe una regla equivalente para la definición de constantes de cadena?

 /* is this good style? */ #define HELLO "Hello World" /* or is this better? */ const char *HELLO2 = "Howdy"; 

¿Qué prefieres? Si es posible mostrar algunos inconvenientes de cualquiera de los métodos.

Hay un camino más (al menos) a Roma:

 static const char HELLO3[] = "Howdy"; 

( static – opcional – es para evitar que entre en conflicto con otros archivos). Preferiría este uno sobre const char* , porque entonces podrá usar sizeof(HELLO3) y, por lo tanto, no tiene que posponer hasta el tiempo de ejecución lo que puede hacer en tiempo de comstackción.

Sin embargo, la definición tiene una ventaja de la concatenación en tiempo de comstackción (¡ HELLO ", World!" ) Y también puede sizeof(HELLO) .

Pero también puede preferir const char* y usarlo en múltiples archivos, lo que le ahorraría un montón de memoria.

En resumen – depende.

Una ventaja (aunque muy leve) de definir constantes de cadena es que puede concatenarlas:

 #define HOLA "hola"
 #definar MUNDO "mundo"

 pone (hola mundo);

No estoy seguro de que sea realmente una ventaja, pero es una técnica que no se puede utilizar con const char *.

Si desea una “cadena de caracteres” como dice su pregunta, realmente me gustaría la versión que declaró en su pregunta:

 /* first version */ const char *HELLO2 = "Howdy"; 

En particular, evitaría:

 /* second version */ const char HELLO2[] = "Howdy"; 

Motivo: el problema con la segunda versión es que el comstackdor hará una copia de toda la cadena “Howdy”, MÁS que la cadena es modificable (por lo que no es realmente constante).

Por otro lado, la primera versión es una cadena constante accesible por el puntero const HELLO2, y no hay forma de que alguien pueda modificarla.

La principal desventaja del método #define es que la cadena se duplica cada vez que se usa, por lo que puede terminar con muchas copias de la misma en el ejecutable, haciéndola más grande.